在表面上,Ruby似乎与其他面向对象的语言非常相似,如Java、Php、C等。
但是,当我们开始遇到障碍的时候,事情会变得有点奇怪。
例如,这是可行的。
(0...8).max()
=> 7 但这不是
(0...8).map(puts "hello world")
hello world
ArgumentError: wrong number of arguments(1 for 0)显然,map方法不使用参数,而是接受块,因此传递用()替换{}修复了错误。
(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] 然后,有些方法应该同时使用块和参数。
8.downto(1){puts "hello world"}
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
=> 8 我遇到的问题是,我是否应该在给定的方法上使用()、{}或这两种方法。它是根据什么来决定的?
{}或params()?。
请帮我理解
发布于 2012-03-16 10:35:06
方法调用后的括号实际上是可选的。
(0...8).map{puts "hello world"}等价于(0...8).map() {puts "hello world"}
所以你不会真的换掉它们。
块的接受完全取决于方法,它们可以在方法声明中指定:
def method(param, &block)
block.call
end它将允许将块作为一个变量从方法中访问,例如通过block.call调用。
还可以通过使用yield关键字来含蓄地使用它们:
def method(param)
yield
end因此,您必须参考API文档,以确定哪些内容被接受或不被接受。
发布于 2012-03-16 10:28:18
它应该记录在方法的API中。
如果有一个接受参数的方法,块通常是可选的--在这种情况下,它被用来“细化”方法的工作方式--例如Hash.new,它可以接受一个参数(默认的散列值)和一个块,用于在键值初始化期间执行智能操作。但是大多数需要块的方法都不接受参数,例如Array#select或Array#map。
发布于 2012-03-16 11:19:03
使用括号将参数传递给函数。这总是一个逗号分隔的对象列表。它们可能是函数的结果,但不必这样做。它们所产生的函数总是只被精确地调用一次。
示例:
x = Array.new
=> []
x.push(2)
=> [2]
x.push(7.modulo(4))
=> [2,3]使用块将函数行为传递给方法。这些函数通常是用许多不同的参数或一定的次数调用的。puts "hello world"是一个打印某些内容,但只返回nil的函数。因此,您几乎不会尝试使用它作为函数的参数(就像将nil传递给该函数一样),但通常会将其作为块传递给一个函数,以便可以多次调用它。
在大多数情况下,您希望有一个块,传递给一个函数,使用参数,这样每次调用它时,它实际上都会执行一些不同的操作。
示例:
(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..8https://stackoverflow.com/questions/9735472
复制相似问题