String#method vs String#method()在ruby中

时间:2012-03-03 16:50:41

标签: ruby

在Ruby中,我们有运行方法的类。示例class.methodName。现在,我来自PHP世界,其中method == function并且应该有括号。在,Ruby。我注意到了。工作与工作渲染相同的结果:

  1. 没有parens:

    "Gaurish".reverse  # => "hsiruaG"
    
  2. 用parens:

    "Gaurish".reverse() # => "hsiruaG"
    
  3. 两者都是一样的。如果是,那么我们应该使用哪一个。如果没有,那有什么区别?

5 个答案:

答案 0 :(得分:4)

简短的回答是两种表达方式几乎相同。更长的是,存在一些差异:

  1. 首先,有些方法几乎总是在没有括号的情况下调用,即使是参数,例如puts - 它的参数很少用括号括起来。提供对实例变量的访问的方法也是如此,例如person.name和类似的。

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

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

  4. 以前的规则不适用于运算符(因为它们是在对象上调用的),因此会经常看到puts "abc" * 5之类的调用。这里没有什么奇怪的 - 运算符比常规方法调用具有更高的优先级,因此很容易弄清楚在这种情况下会发生什么(在给出的示例中,字符串将首先相乘然后传递给pust。 / p>

  5. 当我们在方法的上下文中编写something = 5时,如果我们调用方法(某事物=(值))或为变量赋值,则可能会产生混淆。在这种情况下使用括号会很尴尬,因此当我们希望调用方法时,通常的解决方案是在方法名称前面写self,例如: self.something = 5

  6. 当我们在类方法的上下文中调用getter或没有参数的任何其他方法时会发生类似的情况,例如: name(没有self)。在这种情况下,有两个选项:第一个描述(self.name),第二个我们将括号放在方法名称(name())之后。两者都优于裸方法名称。

  7. 最后但并非最不重要 - 没有参数的方法通常在没有括号的情况下调用,只有一个重要异常 - 当你在方法中调用super而没有参数时接受参数,这些参数将传递给该调用。有时这是不可取的,所以在这种情况下括号是强制性的,即super()不会传递参数。

答案 1 :(得分:3)

他们是一样的。没有空括号的方法调用在Ruby中更为标准。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

puts "lalala"
puts("lalala")

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

是一样的。我更喜欢没有parens的版本,但有时如果你链接方法调用则需要它们。当你想要方法的服务返回值时,也需要Parens将参数作为其他方法的参数,即:

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

答案 4 :(得分:1)

它们是相同的,但如果你的方法有参数,那么首选的是使用parentesis的语法。这是一个例子:

def foo x
  ...
end


foo a * 3

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

对于零参数方法,两种语法都是有效的,通常不使用parathesis不会引起太多的混淆,我想。