首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Ruby中混淆何时使用Parentheses块

在Ruby中混淆何时使用Parentheses块
EN

Stack Overflow用户
提问于 2012-03-16 10:20:36
回答 3查看 999关注 0票数 3

在表面上,Ruby似乎与其他面向对象的语言非常相似,如Java、Php、C等。

但是,当我们开始遇到障碍的时候,事情会变得有点奇怪。

例如,这是可行的。

代码语言:javascript
复制
(0...8).max()
 => 7 

但这不是

代码语言:javascript
复制
(0...8).map(puts "hello world")
hello world
ArgumentError: wrong number of arguments(1 for 0)

显然,map方法不使用参数,而是接受块,因此传递用()替换{}修复了错误。

代码语言:javascript
复制
(0...8).map{puts "hello world"}
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
 => [nil, nil, nil, nil, nil, nil, nil, nil] 

然后,有些方法应该同时使用块和参数。

代码语言:javascript
复制
8.downto(1){puts "hello world"}
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
 => 8 

我遇到的问题是,我是否应该在给定的方法上使用(){}或这两种方法。它是根据什么来决定的?

  • 是固定在每种方法的基础上的&我只是想记住该方法需要什么(块或params)?
  • ,还是有其他逻辑推理来决定它,如果该方法采用块{}或params()

请帮我理解

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-16 10:35:06

方法调用后的括号实际上是可选的。

(0...8).map{puts "hello world"}等价于(0...8).map() {puts "hello world"}

所以你不会真的换掉它们。

块的接受完全取决于方法,它们可以在方法声明中指定:

代码语言:javascript
复制
def method(param, &block)
  block.call
end

它将允许将块作为一个变量从方法中访问,例如通过block.call调用。

还可以通过使用yield关键字来含蓄地使用它们:

代码语言:javascript
复制
def method(param)
  yield
end

因此,您必须参考API文档,以确定哪些内容被接受或不被接受。

票数 6
EN

Stack Overflow用户

发布于 2012-03-16 10:28:18

它应该记录在方法的API中。

如果有一个接受参数的方法,块通常是可选的--在这种情况下,它被用来“细化”方法的工作方式--例如Hash.new,它可以接受一个参数(默认的散列值)和一个块,用于在键值初始化期间执行智能操作。但是大多数需要块的方法都不接受参数,例如Array#selectArray#map

票数 2
EN

Stack Overflow用户

发布于 2012-03-16 11:19:03

使用括号将参数传递给函数。这总是一个逗号分隔的对象列表。它们可能是函数的结果,但不必这样做。它们所产生的函数总是只被精确地调用一次。

示例:

代码语言:javascript
复制
x = Array.new
=> []
x.push(2)
=> [2]
x.push(7.modulo(4))
=> [2,3]

使用块将函数行为传递给方法。这些函数通常是用许多不同的参数或一定的次数调用的。puts "hello world"是一个打印某些内容,但只返回nil的函数。因此,您几乎不会尝试使用它作为函数的参数(就像将nil传递给该函数一样),但通常会将其作为块传递给一个函数,以便可以多次调用它。

在大多数情况下,您希望有一个块,传递给一个函数,使用参数,这样每次调用它时,它实际上都会执行一些不同的操作。

示例:

代码语言:javascript
复制
(0..8).each{ |number| 
  if number.odd?
    puts "#{number} is odd"
  end
}
=> 1 is odd
=> 3 is odd
=> 5 is odd
=> 7 is odd
=> => 0..8
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9735472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档