2012-03-03 59 views
1

在Ruby中,我们有运行方法的类。示例class.methodName。现在,我来自PHP世界where方法==功能,应该有括号。在,Ruby。我注意到了。这两个工作&呈现相同的结果:Ruby中的String#方法vs String#方法()

  1. 没有括号:

    "Gaurish".reverse # => "hsiruaG" 
    
  2. 用括号:

    "Gaurish".reverse() # => "hsiruaG" 
    

都是相同的。如果是,那么我们应该使用哪一个。如果不是,那有什么区别?

+0

重复? http://stackoverflow.com/questions/340624/do-you-leave-parentheses-in-or-out-in-ruby – 2012-03-03 16:54:42

回答

3

它们是一样的。不带空括号的方法调用在Ruby中更加标准。

+2

那么'super'与'super()'的区别呢? – 2012-03-04 17:06:01

2

()是可选的。无论你发现什么更具可读性。

1

它们是相同的,但如果您有方法的参数,则首选parentesis的语法。这里是一个例子:

def foo x 
    ... 
end 


foo a * 3 

会发生什么?会用a调用foo,然后将结果复合3,反之亦然。这可能有点令人困惑。 另外在irb中,例如,您会收到一条警告:“Parantesize参数供将来使用。”

对于零参数方法,我猜这两种语法都是有效的,而且通常不使用parathesis并不会造成太大的混淆。

+0

所以如果有参数就加上括号。跳过它们,如果方法没有参数? – CuriousMind 2012-03-03 17:01:13

+0

这就是我会做的。 – 2012-03-03 18:18:54

2

是的,展位是一样的。你也不需要用parens包装参数,所以:

puts "lalala" 
puts("lalala") 

"alla".gsub 'la', 'a' 
"alla".gsub('la', 'a') 

是一样的。我更喜欢没有parens的版本,但有时如果你的连锁方法调用它们是需要的。括号还需要当你想要成为的方法泰德带参数的返回值作为其他方法的参数,即:

link_to I18n.translate('some text'), root_path 
4

简短的回答是,两个表达式都几乎相同。时间越长,是有一定的差异:

  1. 首先,有一些方法,这些几乎都是所谓的没有括号,即使有争论,例如puts - 它的论点很少被括号包裹。提供访问实例变量的方法也是如此,如person.name等。

  2. 如果你有很多方法链接,那么无参数方法通常不会有括号,而有参数的方法则会有。 例如"aaaabc".squeeze.sub(/ab/,"c").upcase

  3. 如果存在未在对象上调用的嵌套方法调用,则应使用括号包装主题的参数以避免混淆,例如, puts rand 5 - 即使它有效,但可能很难弄清楚在这里发生了什么,所以首选的样式是puts rand(5)

  4. 上述规则不适用于运算符(因为它们是在对象上调用的),所以会经常看到如puts "abc" * 5的调用。任何异常 - 运营商拥有比普通方法调用较高的优先级,所以它应该是很容易弄清楚在这种情况下会发生什么(在给出的例子中,字符串就会成倍增加,然后再传递到pust

  5. 。当我们在方法的上下文中编写something = 5时,如果我们调用一个方法(something =(value))或给变量赋值,可能会产生混淆。在这种情况下使用括号会很困难,所以通常的解决方案当我们想调用一个方法是在方法名前面写上self,例如self.something = 5

  6. 当我们调用getter或其他没有p的方法时,会出现类似的情况在类方法的上下文中的aremeters,例如name(没有self)。在这种情况下,有两种选择:第一种是上述(self.name),第二种是在方法名称(name())之后加上括号。两者都优于裸方法名称。

  7. 而最后但并非最不重要 - 不带参数的方法通常被称作没有括号,用一个重要的例外 - 当您在接受参数的方法调用super不带任何参数,这些参数将被传递到呼叫。有时候这是不期望的,所以在这种情况下括号是强制性的,即super()不会传递参数。

+0

很好的答案。另外一种情况是有一个局部变量和一个名称相同的方法。使用没有'()'的名称将使用该变量,使用它与'()'将使用该方法。 – 2012-03-04 22:50:45

+0

是的,我加了这个案子 - p。 6。 – 2012-03-05 11:49:25

相关问题