Block緊跟方法調用,當遇到一個Block時,並不馬上執行其中的代碼。ruby會記住block出現時的上下文(局部變量,當前對象等),而後執行方法調用。ruby
在方法內容,block
能夠被yield
語句調用ui
def three_times yield yield yield end three_times { puts "Hello" }
輸出結果:code
Hello Hello Hello
下面咱們來看一個使用Block使用局部變量的例子對象
def fib_up_to(max) i1, i2 = 1, 1 while i1 <= max yield i1 i1, i2 = i2, i1 + i2 end end fib_up_to(1000) {|i1| print i1, ' '}
輸出結果以下:three
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
在來一個例子:get
def n_times(thing) #這裏咱們返回一個Proc類的對象 lambda { |n| thing * n } end def test(n, block) #使用.call方法調用Proc對象 block.call(n) end puts test(2,n_times(23))
在來一個例子:test
print "(t)imes or (p)lus: " times = gets print "number: " number = Integer(gets) if times =~ /^t/ calc = lambda { |n| n*number } else calc = lambda { |n| n+number } end puts (1..10).collect(&calc).join(', ')
lambda的意思是:Equivalent to Proc.new, except the resulting Proc objects check the number of parameters passed when called.
當咱們使用&calc
的時候就是至關於使用了上面的.call
方法調用block變量