Ruby迭代器

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變量

相關文章
相關標籤/搜索