2012-07-05 41 views
3

例如do_two_simple_things,這需要4行是太多空間對於這樣一個簡單的操作:紅寶石成語如果something_is_true

if something_is_true 
    puts 'error' 
    return 
end 

這個人是一個班輪,但看起來很笨拙。

if something_is_true; puts 'error'; return; end 

我們可以這樣做

# it would be great if this would work because it is short and readable 
puts 'error' and return if something_is_true 
+0

成語是做它的第一種方式。單行條件是爲了做某件事而設計的。否則我從未見過它。 –

+0

我見過很多人寫過'render:status => 404 並返回if參數[:something] .blank?' – powerboy

回答

4

我同意@NedBatchelder你原來的代碼可能是最好的。其他人指出,在你的具體例子中,你可以使用return puts 'error'

不過,爲了學習,你可以可以用組括多個括號的語句,因此在你可以只使用一個的地方使用少量的語句。你說:

# it would be great if this would work because it is short and readable 
puts 'error' and return if something_is_true 

你可以做到這一點有:

(puts 'error'; return) if something_is_true 
+0

這一個答覆我的問題。 – powerboy

7

我不知道爲什麼你認爲空間是這樣的溢價,你的原始代碼是「太多了。」給你的代碼室呼吸,讓它佔據它需要的空間。爲了「節省空間」而變得太棘手是一種虛假的經濟。最重要的是你的代碼可讀性和可理解性。你的原始代碼對我來說很好。

+1

嗨,內德。我不同意你的看法。在保持可讀性的同時節省更多空間意味着您可以在自己的眼睛中使用更多的代碼,這與紅寶石主義編寫短函數的原因相同,爲什麼ruby支持'do_one_simple_thing如果something_is true'語法,爲什麼ruby的慣例是使用2個空格而不是4個空格縮進,爲什麼有些人更喜歡python使用indentation而不是'}'或'end'的選擇。 – powerboy

+1

當然,越短越好,但這並不意味着你可以合理地使它比你所擁有的四條線短。如果代碼因技巧而令人困惑,那麼更適合您的代碼的代碼並不會更好。 –

+0

'puts'error'並返回如果something_is_true'沒有混淆,如果ruby支持這種構造。我有點驚訝地發現,ruby--一種語言在某種意義上強調可讀性 - 沒有這種語法糖。 – powerboy

1

這是一種可怕的,但我認爲它會工作,因爲把返回nil:

puts 'error' || return if something_else 
+0

這有效,但它是可怕的,它依賴於'puts'返回nil這個事實 - 就像有些人(包括我在內)會說的那樣 - 這是一個騙局。 – powerboy

+1

這也不是很好,因爲你應該使用'或'。 –

0

有一天你可能會不太在乎有多少次,你可以在一個單一的代碼行花。我會使用if-end塊,因爲它很簡單,清楚,而且......你知道,這就是它的用途。

1

在這個特定情況下,return沒有值將返回nil;因爲這恰好也是的puts的返回值,你可以只獲得同樣的效果:

return puts "error" if something_else 
0

我建議從來沒有使用;把語句,它往往是無法讀取。但是,還是有其他的方法,兩種思路:第一,加入error(msg, return_value = nil)return

return(error("Message")) if something_is_true 

return(error("Message", value_to_be_returned)) if something_is_true 

第二個,在Ruby中這是慣用的使用異常信號的問題,所以你可以寫這個完美慣用的一行代碼:

raise MyException.new("human explanation of the error") if condition 

在分配中所使用的同樣的想法:

link = doc.at_css(".content a.link") or raise MyException.new("msg")