2012-03-03 58 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

相關問題