0

在 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

为什么允许使用位置参数...但不允许使用命名参数?

4

1 回答 1

2
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 语言语法的一部分实现...

如果你想要这个,我建议创建一个问题(或电子邮件或其他东西)来请求它。

于 2021-06-03T11:57:20.090 回答