2012-03-16 50 views
3

在地面, 红宝石看起来非常相似,如Java,PHP,C等其他物体orieinted语言困惑时使用VS括号中的块红宝石

但是,事情就当我们开始颠簸有点怪分成块。

例如,这工作

(0...8).max() 
=> 7 

但这并不

(0...8).map(puts "hello world") 
hello world 
ArgumentError: wrong number of arguments(1 for 0) 

Apprantly,地图方法不带参数,但不对块,所以通过与{}替换()修复错误。

(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 ()

请帮助我了解

回答

6

括号实际上是可选的。

(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单证,以确保什么是接受。

2

应该方法的API中进行记录。

如果有接受一个参数的方法,所述块通常是可选的 - 它是用来“精炼”的方法的工作方式这样的情况下 - 例如Hash.new,可以接受任何参数(缺省散列值)和一个块,这是用来键值初始化期间做的智能的事情。但是大多数需要阻止的方法都不会接受参数,例如Array#selectArray#map。方法调用后

2

您可以使用小括号将参数传递给函数。这总是逗号分隔的对象列表。它们可能是功能的结果,但不一定。它们所导致的功能总是只能被调用一次。

实施例:

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..8