如何禁止Ruby中的块(要求不给出块参数)

Mar*_*ner 0 ruby syntax semantics

我定义了这个方法:

# @return [Array<String>] items
def produce_items
  ["foo", "bar", "baz"]
end
Run Code Online (Sandbox Code Playgroud)

显然,正确的用法是

produce_items.each do |i|
  puts i
end
Run Code Online (Sandbox Code Playgroud)

但我写了这个,默默无闻:

produce_items do |i|
  puts i
end
Run Code Online (Sandbox Code Playgroud)

有没有办法以produce_items这样的方式声明我的错误用法会产生错误/异常?如果MRI无法做到,那么可以选择其他口译员吗?可以像RuboCopruby-lint这样的静态分析工具吗?

我怀疑它可能很难,因为有一些常见的习惯用法,其中方法采用可选块:

def block_optional_implicitly
  if block_given?
    puts "Got a block"
    yield
  else
    puts "Did not get a block"
  end
end

def block_optional_explicitly(&block)
  unless block.nil?
    puts "Got a block"
    block.call
  else
    puts "Did not get a block"
  end
end
Run Code Online (Sandbox Code Playgroud)

(这与如何在Ruby中需要一个块的问题相反)

Ser*_*sev 5

是的,除了block_given?遍布代码的检查之外,无法在ruby中执行此操作.

将块传递给不期望它的方法没有坏处.除了没有发生的事情(因为你忘记了.each).这应该由单元测试来涵盖.你一石二鸟:让你的代码更容易回归,不要插入fail "unexpected block" if block_given?你的应用程序的每个方法.