为什么不能在 Ruby 3 中组合 `...` 和命名参数?
Why is it not possible to combine `...` and named arguments in Ruby 3?
在 Ruby 3 中,引入了新的 ...
语法,允许这样的构造:
def locked_run(...)
lock
run(...)
unlock
end
此处记录:https://rubyreferences.github.io/rubychanges/3.0.html
经过这次讨论 (https://bugs.ruby-lang.org/issues/16378),决定也加入位置参数:
def block_section(name, ...)
section(name, true, ...)
end
但是,下面仍然会导致语法错误:
def block_section(...)
section(block_section: true, ...)
end
为什么 ...
允许使用位置参数,但不允许使用命名参数?
section(block_section: true, ...)
无论如何这都不是正确的语法。看看 Ruby 是如何做的,它期望命名参数(即散列)是正常参数之后的最后一个参数。
def section(a,b,c,d: false)
puts "#{a} #{b} #{c} #{d}"
end
def old_style_block_section(*args)
section(*args,d: true)
#=> syntax error, unexpected *, expecting ')'
section(d: true,*args)
end
section(1,2,3,d: true)
old_style_block_section(1,2,3)
#=> syntax error, unexpected ',', expecting =>
section(d: true,1,2,3)
所以你需要的是:
section(..., block_section: true)
然而,这仍然行不通,因为它目前尚未作为新 ...
的 Ruby 语言语法的一部分实施。
如果你想要这个,我建议创建一个问题(或通过电子邮件或其他方式)来请求它。
在 Ruby 3 中,引入了新的 ...
语法,允许这样的构造:
def locked_run(...)
lock
run(...)
unlock
end
此处记录:https://rubyreferences.github.io/rubychanges/3.0.html
经过这次讨论 (https://bugs.ruby-lang.org/issues/16378),决定也加入位置参数:
def block_section(name, ...)
section(name, true, ...)
end
但是,下面仍然会导致语法错误:
def block_section(...)
section(block_section: true, ...)
end
为什么 ...
允许使用位置参数,但不允许使用命名参数?
section(block_section: true, ...)
无论如何这都不是正确的语法。看看 Ruby 是如何做的,它期望命名参数(即散列)是正常参数之后的最后一个参数。
def section(a,b,c,d: false)
puts "#{a} #{b} #{c} #{d}"
end
def old_style_block_section(*args)
section(*args,d: true)
#=> syntax error, unexpected *, expecting ')'
section(d: true,*args)
end
section(1,2,3,d: true)
old_style_block_section(1,2,3)
#=> syntax error, unexpected ',', expecting =>
section(d: true,1,2,3)
所以你需要的是:
section(..., block_section: true)
然而,这仍然行不通,因为它目前尚未作为新 ...
的 Ruby 语言语法的一部分实施。
如果你想要这个,我建议创建一个问题(或通过电子邮件或其他方式)来请求它。