我想在我自己创建的类上定义 []
方法来获取 block 。我已经这样做了,如下。
class A
def self.[](*args, &block)
puts "I am calling #{block} on #{args}."
block.(*args)
end
end
我可以按如下方式调用它。
# Explicit method invocation
A.[](1) { |x| puts x }
# With a procedure argument
arg = proc { |x| puts x }
A[2, &arg]
但是,我希望能够做到这一点。
A[3] { |x| puts x }
不幸的是,这似乎会产生语法错误。括号方法是否有 block 语法,或者我是否坚持使用前两种调用它的方法?事实上,更一般地说,哪些 Ruby 方法名称将允许在其调用中使用 block ,因为似乎在允许时可能存在限制?
最佳答案
对于语法错误您无能为力,因此您必须更改语法。
如果您接受:
- 在
Kernel
中定义(即污染)一个大写方法(类似于Kernel#Array
) - 使用括号代替方括号
你可以写:
class A
def self.call_block_with_args(*args, &block)
puts "I am calling #{block} on #{args}."
block.call(*args)
end
end
module Kernel
def A(*args, &block)
A.call_block_with_args(*args, &block)
end
end
它是这样工作的:
A(3) { |x| puts x }
#=>
# I am calling #<Proc:0x000000012b9c50@block_brackets.rb:14> on [3].
# 3
它并不干净,但它可能是最接近 A[3] { |x|把 x }
.
关于带 block 的 Ruby 括号方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41787225/