2016-10-26 33 views
1

我最近遇到下面的Ruby代碼,這是混淆了我就來了:使用Ruby的`或`關鍵字時,創建變量

def initialize(kind, street_1, street_2, city, state, postal_code) 
    @kind = kind or '' 
    @street_1 = street_1 or '' 
    @street_2 = street_2 or '' 
    @city = city or '' 
    @state = state or '' 
    @postal_code = postal_code or '' 
end 

我不明白or在此代碼玩​​什麼角色。有人可以解釋嗎?

回答

5

編輯:應該指出的是,or關鍵字不會在這種情況下工作,但其意圖是正確的 - 在這個例子中使用||代替or將產生所需的輸出。

此代碼中的or關鍵字意味着,如果該參數被分配給局部變量(即分別kind@kind)是nil,則本地變量的值應該被初始化爲''

另一種方式來看看這個 - 如果我叫Class.new("something", "1800 Wallaby Way", nil, nil, nil, nil),那麼類將被初始化爲這樣:

@kind = "something" 
@street_1 = "1800 Wallaby Way" 
@street_2 = '' 
@city = ' 
@state = '' 
@postal_code = '' 
+1

不僅僅是'nil',而且'false'(在Ruby中評估爲'false'的兩個值) – jayelm

+0

精彩點,謝謝! – CalmBit

+0

Hrm。這是非常有道理的,但是當我測試這個時,看起來並不符合我所看到的。 也就是說,假設我將'initialize'方法的一行更改爲:'@state = state或「TX」'。現在讓我們說我叫'Class.new(「something」,「1800 Wallaby Way」,零,零,零,零)''。 做完所有這些之後,如果我在'@ state'上調用'puts',你會不會期望輸出是'TX'。我會的,但似乎並非如此。相反,輸出是空白的,表明'或'關鍵字*不能*生效。 我的代碼:https://repl.it/EGO0/0 – filmnut

0

它在默認添加如果你不指定,當你創建一個新的實例o每個變量f似乎是一個「地址」對象。

例如,

x = Address.new() 

x.kind == '' 

# evaluates to true 
+0

儘量不要在方法名稱和它們的參數之間放置空格。它會導致很大的問題。 – tadman

3

你有三種方法來解決這個問題。首先是使用括號使鬆散結合or不會失去價值的抓地力:

@kind = (kind or '') 

第二種是使用強結合||等效運營:

@kind = kind || '' 

第三個選項,這是最好的,是不在乎和公正處理:

@kind = kind.to_s 

這樣如果這是您想要的行爲,將自動轉換爲空字符串。

+0

很好的解釋,但是看到#1(最可怕的人會認爲不如第二名)是不尋常的。另一種選擇是'@kind = kind?善良:'''。雖然比別人長,但可能更具表現力。 –

+0

我不確定三元組在那裏增加了什麼重要的意義,事實上可能有人想知道爲什麼它是如此重複。 – tadman

相關問題