2015-07-02 77 views
0

我試圖清理從此我的代碼...使用定義?在三元操作符

<% if defined? foo == "local-variable" %> 
    <% foo = foo %> 
<% else %> 
    <% foo = nil %> 
<% end %> 

要使用三元運算符是這樣的...

<% defined? foo == "local-variable" ? foo : nil %> 

但是三元不運行正確,並默認爲nil ...我使用三元運算符(可能已經養成了使用它們的習慣,因爲它們保存了行)...在三元組中可能使用defined?

+2

順便說一句,你的第二個聲明不等同於第一個 - 該任務是missi ng,即'foo'沒有被設置爲'nil'。 – Stefan

+0

真的需要'foo = foo'嗎? – limekin

+0

@limekin不,我不是更傾向於建議'<%foo = nil,除非local_variable_defined?(foo)%>'或者@PiotrKruczek建議'<%foo || = nil%>'但這兩種方法都不屬於這個問題。此外,我不知道這裏的實現或爲什麼這個邏輯必須存在於視圖而不是控制器或模型中。 – engineersmnky

回答

4

它應該是:

<% defined?(foo) == "local-variable" ? foo : nil %> 

...返回值提供有關信息的表達。

>> defined?(foo) == "local-variable" 
=> true 
>> defined? foo 
=> "local-variable" 
>> defined? (foo == "local-variable") 
=> "method" 

Ruby operator precedence

+0

啊完美我只是忘了括號。謝謝! – mikeymurph77

+2

應該避免使用'local_variable_defined?(:foo)'而不是'defined?(foo)==「local-variable」' – Stefan

+0

'defined?'應該避免,除非你確切地知道你在做什麼。既然你只是將它用於本地變量,我同意@ Stefan的建議。看到我的答案(http://stackoverflow.com/questions/29371966/ruby-defined-operator-works-wrong/29372162#29372162)的一些問題'定義?' – Max

2

這是不完全的回答你的問題,但這樣的事情可能會有所幫助:

foo ||= nil 

翻譯爲:

if defined? foo 
    foo || foo = nil 
else 
    foo = nil 
end 
+0

這不*精確*真實。這意味着'foo'可以是'false'或'nil'。有人在談論增加'// ='這意味着你正在談論的是什麼,但我不確定那個提案到底在哪裏。 – tadman