ruby系列教材(26):More about methods(2)

上一篇 / 下一篇  2008-02-02 15:31:27 / 个人分类:Ruby

Methods and Blocks:

我们前面谈到了blocks的调用方式,先检查method and arguments,然后开始运行method,当出现了yield statement的时候开始转到block,这就是说,假如有yield,就必须有block

 

1.常见用法:

def take_block(p1)

  if block_given?

    yield(p1)

  else

    p1

  end

end

 

take_block("block")

take_block("block"){|s| p s}

 

2.非常见用法:

我们前面谈到,在parameter前面加上一个*,表示在此method中,生成一个同名(不含*)的Array Object,同样的在parameter前面加上一个&,表示在此method中,生成一个同名(不含&)的Proc Object,什么是Proc Object?我们这里介绍一下它的call method:

a_proc = Proc.new {|a, *b| b.collect {|i| i*a }}      # new产生一个object,new后面接一个block
a_proc.call(9, 1, 2, 3)   #=> [9, 18, 27]                 # 根据上句的block进行运算,返回值放入一个Array Object

总的来说Proc class就是,使用block进行初始化,call method传递arguments到block中,返回值为block的返回值

 

class TaxCalculator

  def initialize(name, &block)

    @name, @block = name, block

  end

  def get_tax(amount)

   "#@nameon #{amount} = #{ @block.call(amount) }"

  end

end

tc = TaxCalculator.new("Sales tax") {|amt| amt * 0.075 }

tc.get_tax(100)→"Sales tax on 100 = 7.5"

tc.get_tax(250)→"Sales tax on 250 = 18.75"

 

 

self 和 ::

self 使用在methods里面,表示引用此method的object(或者说是receiver),前面的文章有提到过,并带有详细的例子

::的含义,这里我们只做简单的介绍,用法 ModuleName::ModuleName::ClassName 或者 ClassName::CONSTANTNAME。先来说说Module,简单的可以认为是class的集合(远远不止这些)。使用Test::Unit::TestCase 就是Test(模版名),Unit(模版名),TestCase(类名),经常在Rails中看见:class ApplicationController < ActionController::Base ,就是说ActionController module中的Base Class。除此之外,还有就是可以使用ClassName::CONSTANT,比如Math::PI。以后会设计到更加复杂的内容

 

 

return的用途

如果一个method有返回值,我们通常都这么做:

def test

  "hi"

end

因为这样简洁方便,那是不是return就没有了用出了?其实return可以这样用:

def test

  return "hi","hi2"       #必须使用return,否则报错,即不能省略return

end

这样一个method可以返回多个值,返回的结果会使用Array Object保存起来

 

 

数组与arguments

前面说过在定义的时候使用*args,可以提供一个可变argument lists,现在,在使用方法的时候,数组可以转换成argument lists,比如:

def test(a,b,c)

  puts "#{a} #{b} #{c}"

end

arr = [1,2,3]

test(*arr)              #星号不能少

结果:

1 2 3

 

调用method的时候,在Array Object前面加上*,作为arguments,实际上是把Array Object中的elements作为arguments


TAG: Ruby

 

评分:0

我来说两句

我的栏目

日历

« 2024-06-02  
      1
2345678
9101112131415
16171819202122
23242526272829
30      

数据统计

  • 访问量: 23392
  • 日志数: 47
  • 建立时间: 2008-01-29
  • 更新时间: 2008-02-02

RSS订阅

Open Toolbar