1. 程式人生 > >深入理解 Ruby 關鍵字 yiald

深入理解 Ruby 關鍵字 yiald

yield

  • 是ruby比較有特色的一個地方,本文將具體理解一下yield的用法。
  • 在函式裡面的有一條yield語句,到時候執行的時候可以執行函式類外的block。而且這個block可以有自己的context,感覺有點像callback,又有點像c裡面的巨集定義。
def call_block 

      puts "Start of method" 

      yield 

      yield 

      puts "End of method" 

    end 

    call_block { puts "In the block" } 

結果 yield 將呼叫表示式後面的block

輸出:

 Start of method 
 In the block 
 In the block 
 End of method
 #!/usr/bin/ruby
    def test
       puts "You are in the method"
       yield
       puts "You are again back to the method"
       yield
    end
    test {puts "You are in the block"}

輸出:

You are in the method
You are in the block
You are again back to the method
You are in the block
    #!/usr/bin/ruby

    def test
       yield 5
       puts "You are in the method test"
       yield 100
    end
    test {|i| puts "You are in the block #{i}"}

這將產生以下結果:
You are in the block 5
You are in the method test
You are in the block 100

在這裡,yield 語句後跟著引數。您甚至可以傳遞多個引數。在塊中,您可以在兩個豎線之間放置一個變數來接受引數。因此,在上面的程式碼中,yield 5 語句向 test 塊傳遞值 5 作為引數。
現在,看下面的語句:

test {|i| puts “You are in the block #{i}”}

在這裡,值 5 會在變數 i 中收到。現在,觀察下面的 puts 語句:

puts “You are in the block #{i}”

這個 puts 語句的輸出是:

You are in the block 5

如果您想要傳遞多個引數,那麼 yield 語句如下所示:

yield a, b

此時,塊如下所示:

test {|a, b| statement}

但是如果方法的最後一個引數前帶有 &,那麼您可以向該方法傳遞一個塊,且這個塊可被賦給最後一個引數。如果 * 和 & 同時出現在引數列表中,& 應放在後面。

    #!/usr/bin/ruby
    def test(&block)
       block.call
    end
    test { puts "Hello World!"}

這將產生以下結果:

引用塊內容

Hello World!