很抱歉,如果這是一個愚蠢的問題,但我是一個C#的傢伙摸索他周圍紅寶石方式..條件語句是在表達式之前還是之後出現?
紅寶石我注意到有很多人做到這一點:
do_something(with params) if 1 = 1
有什麼不同(即使是輕微的):
if 1 = 1 do_something(with params)
或者它是同樣的事情寫出更好的清晰度?
很抱歉,如果這是一個愚蠢的問題,但我是一個C#的傢伙摸索他周圍紅寶石方式..條件語句是在表達式之前還是之後出現?
紅寶石我注意到有很多人做到這一點:
do_something(with params) if 1 = 1
有什麼不同(即使是輕微的):
if 1 = 1 do_something(with params)
或者它是同樣的事情寫出更好的清晰度?
它是語法糖...允許我們以更容易閱讀的方式編寫代碼。
http://rubylearning.com/satishtalim/ruby_syntactic_sugar.html
注:@Phrogz,以下是不一樣的! 請確保您沒有嘗試爲變量賦值,而不是將變量與值進行比較!另外,正如Phrogz所提到的,變量賦值的順序有很大的不同......請參閱@Phrogz對於mor細節的回答!
if 1 = 1 then do_something(with params) end
if 1 == 1 then do_something(with params) end
火起來irb
並運行代碼,您將瞭解到:
if 1==1
之後有一個表達式,你將不得不添加一個:
或then
並關閉一個end
。尾隨if
應該只能用於單個表達式,並且不能添加else
。它們被稱爲語句修飾符,它們只是語法糖以提高可讀性。我並不完全反對他們,但建議謹慎使用它們。
後者在語法上無效。您需要編寫:
if 1==1 then do_something(with params) end
單線條件必須始終跟蹤。和是的,有差別。嘗試這些出:
bar1 = if foo1=14
foo1*3
end
#=> 42
bar2 = foo2*3 if foo2=14
#=> NameError: undefined local variable or method `foo2' for main:Object
在後者中,紅寶石看到參考後的分配等對待foo2
爲方法,而不是局部變量。這只是一個問題的時候:
`warning:found = in conditional,should == == – 2010-12-21 15:07:14
您可以使用,但如果您先將if語句放在首位,則需要使用'end'關閉條件。
if 1==1
do_something(with params)
end
以下葉片foo
爲零。
foo = true unless defined?(foo) #Leaves foo as nil
這是因爲Ruby創建一個變量foo
並將其分配給當它讀取(解析,我認爲)爲零的foo = true
位,然後當它讀取(執行,我認爲)的unless defined?(foo)
,它說, foo
被定義(它被定義爲nil),因此不執行foo = true
部分。
如果你沒有
unless defined?(foo)
foo = true
end
,那麼你會得到foo
assinged爲true。
我說這What are the Ruby Gotchas a newbie should be warned about?,因爲有人糊塗了吧here。
所以,是的,在某些情況下,它能夠決定的事情。
它主要是文體。當處理單行代碼時,我使用尾部條件,因爲它似乎更有意義的交談。由於編寫軟件的一大部分是使其易於維護,因此我試圖用一種可以輕鬆滑入大腦的方式編寫它。有些書推薦使用一個塊或者僅僅包含條件`if(blah)... some code ... end`,爭辯說它對未來的代碼擴展更好。如果我們需要添加一些東西,關閉`結束'已經在那裏。我發現用vim-powers很容易解決這個問題,所以我主要使用單線。 – 2010-12-21 16:28:57