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无法做到,那么可以选择其他口译员吗?可以像RuboCop或ruby-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中需要一个块的问题相反?)
是的,除了block_given?遍布代码的检查之外,无法在ruby中执行此操作.
将块传递给不期望它的方法没有坏处.除了没有发生的事情(因为你忘记了.each).这应该由单元测试来涵盖.你一石二鸟:让你的代码更容易回归,不要插入fail "unexpected block" if block_given?你的应用程序的每个方法.