一般在Ruby中,它们是匿名方法(闭包),如果你愿意块的概念。
您可以将块传递给任何方法。该方法可以使用yield
(与block_given?
一起)调用方法/块,或者使用&
运算符将其引用到变量。后者可用于存储引用或将其传递给另一种方法。
def call_it_twice
2.times {|i| yield(i) }
end
call_it_twice { puts "hello" }
# hello
# hello
call_it_twice {|i| puts "hello #{i}" }
# hello 0
# hello 1
def call_it_thrice &block
call_it_twice(&block)
block.call(2)
end
call_it_thrice {|i| puts "hello #{i}" }
# hello 0
# hello 1
# hello 2
您也可以传递一个文字方法,但它并不常见。
class Foo
def hello
puts "world"
end
end
Foo.instance_methods(:hello)
# #<UnboundMethod: Foo#hello>
Foo.instance_method(:hello).call
# NoMethodError: undefined method `call' for #<UnboundMethod: Foo#hello>
Foo.instance_method(:hello).bind(Foo.new).call
# world
Foo.new.method(:hello)
# #<Method: Foo#hello>
Foo.new.method(:hello).call
# world
常见的事是写array.map{|x| x.downcase }
为array.map(&:downcase)
(这是to_proc
快捷方式,以便它array.map(&:downcase.to_proc)
幕后)。
比较陌生,虽然是这样的:array.each{|x| puts x }
是一样的Ruby array.each(&method(:puts))
感谢您的回答最大!你如何使用'my_function。()'而不是'my_function.call()'? – 2014-10-17 20:42:33
没有特别的理由。它做同样的事情,只是更短。 – Max 2014-10-17 20:45:09