带 block 的 Ruby 括号方法

标签 ruby syntactic-sugar

我想在我自己创建的类上定义 [] 方法来获取 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/

相关文章:

scala - Scala 中是否有用于在匿名函数中绑定(bind)值的语法糖?

python - 将循环打包到函数中以静音变量的Pythonic 方法?

ruby-on-rails - 主要 :Object 的未定义方法 `root'

ruby - 一种从数组中选择最大值的方法

java,有没有办法我们可以用另一个名字导入一个类

c# - C# 的类似 Python 的字典声明?

javascript - 最好的 JavaScript 语法糖

ruby-on-rails - 变量传递以在部分中使用路径

ruby-on-rails - 设计未定义的方法 `first_name'

ruby-on-rails - 每秒 MacOS 唤醒错误