ruby - 调用具有多个参数和 block 的方法的 ruby​​ 语法是什么?

标签 ruby syntax dsl ruby-2.0

Ruby 不喜欢这样:

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

我也不知道为什么。我正在尝试创建 DSL。 “项目”方法如下所示:

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

为项目取一个名字,项目的类型,和一个方 block 。构造一个项目生成器,并在其上下文中执行该 block 。

不管我是否需要使用 instance_exec(我想我不需要——它可以塞进初始化器),我得到这个:

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

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

最佳答案

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

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

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

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

或:

item(:name, :text) do
  label('Name')
end

关于ruby - 调用具有多个参数和 block 的方法的 ruby​​ 语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19802419/

相关文章:

ruby-on-rails - 使用前端服务器和不同机器上的音频文件在 LAN 上运行 Ruby on rails 应用程序的流式音频?

mysql - Rails 表中整数的默认大小 (MySQL)

ruby - TCPServer 如何从 Ruby 中的 http 请求接收数据?

scala - 用于与 Scala 解析器组合器匹配的自定义逻辑

python - 如果没有 Web 框架(Django/Rails),Flex + Python/Ruby 有什么用处?

c++ - 告诉编译器我不再使用 C++ 中的命名空间

haskell - Haskell 和类 Haskell 语言之间的类型声明语法差异

syntax - 它适用于太多的论点;也许你忘记了 `;'

android - 预览 Anko DSL View

eclipse - 在 Eclipse 中禁用 "Add Xtext nature"对话框