2012-07-14 51 views
1

下面是代碼行:這行代碼是什麼意思? !一個Hash []內

options[:selectors] = [[1, "Spain"], [2, "Italy"]] 
v = "Monthly" 

value = Hash[options[:selectors]][!!(v =~ /^[0-9]+$/) ? v.to_i : v] 

我不知道的主要部分是最後一行的這一部分:

[!!(v =~ /^[0-9]+$/) ? v.to_i : v] 

什麼[!!平均,=~是什麼意思?最後,總體線是什麼意思?

回答

5

!!是一種成語,意思是「將此值更改爲布爾值」。第一個!進行類型轉換,第二個!使它恢復語義,同時保留它的布爾值。

雖然這在ruby中並不適合。我相信這是一個PHPism。

=~是一個正則表達式匹配。

最後,整個事情的意思是「如果v是一個int字符串,使v爲整數類型並從哈希中獲取,否則使用該字符串作爲關鍵字。」

+0

這很合適,但'!!'是多餘的。 – itdoesntwork 2012-07-14 03:47:53

1

!!是一個雙重否定,用於將任何對象轉換爲truefalse值的成語。

它可以工作,因爲除了falsenil之外的任何對象的評估爲true。否定的對象產生false,並且否定了這一結果返回true

object = Object.new 

not object 
# => false 

not not object 
# => true 

如果我們試圖否定nil,我們得到true,如果我們試圖否定這一結果,我們得到false

object = nil 

not object 
# => true 

not not object 
# => false 

該代碼:

!!(v =~ /^[0-9]+$/) ? v.to_i : v 

轉換返回的值表達式,可以是任何對象,可以是truefalse。該布爾值然後用作ternary operator的參數。

這意味着:如果字符串包含一個整數,然後將其轉換爲一個,否則只是返回字符串。