1

Ruby 不喜欢这样:

item (:name, :text) {
  label('Name')
}

我不知道为什么。我正在尝试创建一个 DSL。'item' 方法如下所示:

def item(name, type, &block) 
  i = QbeItemBuilder.new(@ds, name, QbeType.gettype(type))
  i.instance_exec &block
end

取项目的名称、项目的类型和块。构造一个项目生成器,并在其上下文中执行该块。

无论我是否需要使用 instance_exec (我认为我不需要 - 它可以填充在初始化程序中),我都会得到这个:

SyntaxError (ds_name.ds:5: syntax error, unexpected ',', expecting ')'
  item (:name, :text) {
              ^

如何使用多个参数和一个块调用方法?ruby 认为我想要做什么?

4

2 回答 2

3

括号前的空格导致 ruby(:name, :text)​​ 在调用导致语法错误的方法之前评估为单个参数。查看这些示例以进行说明:

puts 1      # equivalent to puts(1)       - valid
puts (1)    # equivalent to puts((1))     - valid
puts (1..2) # equivalent to puts((1..2))  - valid
puts (1, 2) # equivalent to puts((1, 2))  - syntax error
puts(1, 2)  # valid

您提供块的方式在语法上是有效的,但是当块与方法调用不在同一行时,通常最好使用do ... end语法。

因此,要回答您的问题,您可以使用:

item(:name, :text) { label('Name') }

或者:

item(:name, :text) do
  label('Name')
end
于 2013-11-06T01:49:56.733 回答
2

(删除in之前的空格item (:name, :text) {

于 2013-11-06T01:34:24.293 回答