2014-10-19 53 views
4

我碰到這行代碼,無法理解點的用途。有人可以解釋65 . + rand(10)中的點在做什麼以及這與65 + rand(10)有什麼不同?在這行代碼中,點的含義是:65. + rand(10)

對於全方面,我看到這個代碼,這8字符隨機字符串發生器內:

(0...8).map{65.+(rand(25)).chr}.join => "QSILUSPP" 
(0...8).map{65.+(rand(25)).chr}.join => "BJIIBQEE" 
(0...8).map{65.+(rand(25)).chr}.join => "XORWVKDV" 
+2

如果你的問題是關於'65。+(...)'部分的具體問題,那麼你應該刪除其餘部分,因爲它會分散你的實際問題。 – meagar 2014-10-19 22:37:37

回答

2

您可以注意到,在原始代碼中有2個方法調用 - +chr。我可以用等效代碼展示它:

65.send(:+, rand(10)).send(:chr) # is the equal to following line: 
65.+(rand(10)).chr 

這個技巧會產生方法鏈,允許跳過圓括號。隨着括號,65.+(rand(10)).chr可以這樣寫:

(65 + rand(10)).chr 

如果沒有這一招,chr將適用於rand(10)和結果字符串將嘗試添加到65.這將產生類型錯誤:

65+(rand(25)).chr 
TypeError: String can't be coerced into Fixnum 
+0

(1)'65. + (...)'不是一招,'67 + ...'是訣竅(語法糖)。 (2)你有什麼沒有大括號,他們是括號。 (3)你寫了「... apply [on] rand(10)'...」,在這個例子中你有'rand(25.1)'。這是誤導。 – sawa 2014-10-20 00:45:06

+0

當然,這不是一個竅門。但仍然是日常編程的不尋常舉動。你需要明確地調用'。+'的理由。在這種情況下,作者將其用於方法鏈。而那種避免日常編程的做法就是我所說的「詭計」。 – 2014-10-20 06:06:41

1

它沒有任何不同。由於數字是Ruby中的對象,因此+實際上是一個方法調用,因此可以像使用任何其他方法一樣使用點語法。您習慣看到的表單65 + rand(10)是「語法糖」,相當於65.+(rand(10))

爲什麼有人會使用.+來編寫代碼,我不知道。

+0

對於它而言,這裏是'+'的文檔:http://www.ruby-doc.org/core-2.1.3/Fixnum.html#method-i-2B – 2014-10-19 22:37:08

相關問題