【问题标题】:Whats the ruby syntax for calling a method with multiple parameters and a block?调用具有多个参数和块的方法的 ruby​​ 语法是什么?
【发布时间】:2013-11-06 01:29:24
【问题描述】:

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 认为我想要做什么?

【问题讨论】:

    标签: ruby syntax dsl ruby-2.0


    【解决方案1】:

    括号前的空格导致 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
    

    【讨论】:

    • 啊!啊!它试图评估括号,但作为一个表达式!谢谢,伙计。
    【解决方案2】:

    去掉item (:name, :text) { (前面的空格

    【讨论】:

    • 不应该在括号和参数之间放置一个空格。
    猜你喜欢
    • 2019-11-16
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2011-10-14
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    相关资源
    最近更新 更多