2010-12-21 27 views
6

很抱歉,如果這是一個愚蠢的問題,但我是一個C#的傢伙摸索他周圍紅寶石方式..條件語句是在表達式之前還是之後出現?

紅寶石我注意到有很多人做到這一點:

do_something(with params) if 1 = 1 

有什麼不同(即使是輕微的):

if 1 = 1 do_something(with params) 

或者它是同樣的事情寫出更好的清晰度?

+0

它主要是文體。當處理單行代碼時,我使用尾部條件,因爲它似乎更有意義的交談。由於編寫軟件的一大部分是使其易於維護,因此我試圖用一種可以輕鬆滑入大腦的方式編寫它。有些書推薦使用一個塊或者僅僅包含條件`if(blah)... some code ... end`,爭辯說它對未來的代碼擴展更好。如果我們需要添加一些東西,關閉`結束'已經在那裏。我發現用vim-powers很容易解決這個問題,所以我主要使用單線。 – 2010-12-21 16:28:57

回答

2

它是語法糖...允許我們以更容易閱讀的方式編寫代碼。

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 
4

火起來irb並運行代碼,您將瞭解到:

  • 1 = 1是一個語法錯誤,更改爲1 == 1。
  • 你不能直接在if 1==1之後有一個表達式,你將不得不添加一個:then並關閉一個end

尾隨if應該只能用於單個表達式,並且不能添加else。它們被稱爲語句修飾符,它們只是語法糖以提高可讀性。我並不完全反對他們,但建議謹慎使用它們。

6

後者在語法上無效。您需要編寫:

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爲方法,而不是局部變量。這只是一個問題的時候:

  • 您有意使用有條件分配(不測試平等),和
  • 這是第一次(在源順序而言),這個變量已經被分配在範圍內。
+0

`warning:found = in conditional,should == == – 2010-12-21 15:07:14

2

您可以使用,但如果您先將if語句放在首位,則需要使用'end'關閉條件。

if 1==1 
    do_something(with params) 
end 
0

以下葉片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

所以,是的,在某些情況下,它能夠決定的事情。

相關問題