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