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认为我想做什么?
答案 0 :(得分: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
答案 1 :(得分:2)
删除(
item (:name, :text) {
之前的空格