2012-05-30 87 views
1

每次在比較單個值和比較多個值之間切換時,必須切換變量和值。可以在Ruby的Object類中添加一個方便的方法嗎?

return if params[:controller] == 'users' 
return if ['users', 'sessions', 'admin'].include? params[:controller]. 

以下反轉語法Array#include

class Object 
    def in?(arr) 
    arr.include? self 
    end 
    def not_in?(arr) 
    !(arr.include? self) 
    end 
end 

現在你可能會說:

return if params[:controller] == 'users' 
return if params[:controller].in? ['users', 'sessions', 'admin'] 

有沒有更好/更安全的方式做到這一點,而不與Object類玩?

+0

毫無疑問,有更好更安全的方法,但是您使用的Rails已經是Monkey Patch Heaven了,那麼爲什麼不修改Object呢? :) –

+0

你可以寫第一個'return if''users']。include? PARAMS [:控制器]'。只有稍微難看。 (我剛剛注意到你在重寫時使用'in?'而不是'include?',所以我刪除了更改後的語法警告..) – sarnold

+2

爲什麼要這麼做?你已經有了相當短的表達來做同樣的事情。你也以一種沒有道理的方式來顛倒責任:你告訴一個對象看看它是否在某個其他對象中,而不是詢問一個對象是否包含對象。一般來說,如果你不得不對對象進行猴子修補,那麼你做錯了。 –

回答

1

爲什麼不只是反轉其他情況下匹配?

return if 'users' == params[:controller] 

除了排隊與多值的情況下,它避免意外使用賦值運算符=,而不是平等的經營者==的。

+0

我很不舒服地修改Object,並且決定反對它。我選擇Mark的答案是爲了避免=/==打印錯誤,這可能會產生不受歡迎的「功能」。感謝大家的投入。 – Anil

0

Monkey Patch並不總是安全的,但正如您所知,它在Rails中被廣泛使用。

您可以隨時修改打開的類,但要確保所有更改都具有唯一名稱,以免造成衝突。

相關問題