0
A
回答
2
Ruby中的每個方法都有一個特殊的「塊」插槽,它不是一個普通的參數。這是因爲向方法傳遞正好一個塊是最常見的用例,Ruby會優化它。 &
符號用於表示特定內容在該插槽內的傳遞。
def with_regular_argument(block)
block.call
end
def with_block_argument(&block)
block.call
end
with_regular_argument lambda { puts 'regular' } # regular
with_block_argument { puts 'block argument' } # block argument
該符號也可用於調用方法。這樣,你可以傳遞任何對象作爲該塊,並且to_proc
將被調用以強制它到Proc
。
def to_proc
proc { puts 'the main object was converted to a Proc!' }
end
with_block_argument &self # the main object was converted to a Proc!
注意,強迫就不會被執行了你調用with_regular_argument
:
begin
with_regular_argument self
rescue => error
puts error.message # undefined method `call' for main:Object
end
的Symbol
類實現to_proc
。它基本上是這樣工作的:
class Symbol
def to_proc
proc { |receiver| receiver.send self }
end
end
那麼,下面的行是如何工作的?
enumerable.map &:to_s
- 我們在特殊塊槽傳遞
:to_s
。這由&
表示。 - 使用
&
在符號上調用to_proc
。 to_proc
返回Proc
,它將:to_s
發送到第一個參數。- 然後將這個
Proc
傳遞給特殊塊槽中的map
方法。 - 產生的每個元素都成爲消息的接收者。
這是相當多的等價於:
enumerable.map { |receiver| receiver.send :to_s }
¹耶胡達·卡茨。 Ruby不是一個可調用語言(它是面向對象的)。 Blog post。
相關問題
- 1. 將塊傳遞給方法
- 2. 替代方法將列表傳遞給MVC中的HttpGet方法
- 3. 將塊傳遞給Java中的方法
- 4. 將傳遞給方法的塊傳遞給Ruby中的另一個方法
- 5. 將塊傳遞給AFNetworking方法?
- 6. 將塊傳遞給異步方法
- 7. 將EF實體傳遞給JSON的最佳替代方法
- 8. 將代理傳遞給WPF WebBrowser.InvokeScript方法
- 9. 將迭代器傳遞給方法
- 10. 將httpservletrequest傳遞給方法
- 11. 將ArrayList傳遞給方法?
- 12. 將CharArray傳遞給方法
- 13. 將int []傳遞給方法
- 14. 將Stringstream傳遞給方法
- 15. 將變量傳遞給Javascript模塊化模式方法
- 16. 如何將方塊傳遞給方法調用?
- 17. 將參數傳遞給方法的好奇方式
- 18. 當塊需要變量時將塊傳遞給方法
- 19. 替代無效的作爲參數傳遞給模板方法
- 20. 將內部遞歸方法的值傳遞給外部方法
- 21. 傳遞塊的方法
- 22. 無法將數組傳遞給方法
- 23. 將參數傳遞給方法的CakePHP
- 24. 將argv []傳遞給CreateProcess()的方法
- 25. 將值傳遞給方法的問題
- 26. Rails - 將選項傳遞給接受塊的輔助方法?
- 27. 如何將多個塊傳遞給ruby中的方法?
- 28. Ruby:將塊傳遞給定義實例方法的類宏
- 29. 將參數傳遞給使用cmd模塊的方法
- 30. 將params傳遞給模塊的最常見方法是什麼?