2011-02-23 48 views
0

今天,在通過代碼進行瀏覽時,我注意到一些意想不到的情況。此聲明:Ruby 1.9.2 Object.respond_to? :hello && Object.hello給出錯誤,爲什麼?

if Object.respond_to? :你好& & Object.hello #stuff

給出了未定義的方法錯誤。但爲什麼?顯然你好不是一個有效的對象的方法,但考慮到短路評估,不應該Object.hello被忽略每當Object.respond_to? :你好,是假的?

我在使用Authlogic時注意到了這一點,試圖弄清楚爲什麼UserSession類必須定義持久性? in Rails 3.

謝謝

回答

4

缺乏括號是導致優先發布:

>> Object.respond_to? :hello && Object.hello 
NoMethodError: undefined method `hello' for Object:Class 
    from (irb):2 
    from /Users/john/.rvm/rubies/ruby-1.9.2-p136/bin/irb:16:in `<main>' 
>> Object.respond_to?(:hello) && Object.hello 
=> false 
+0

第329行給出了一個NoMethodFound錯誤,除非你定義了一個持久的?行爲。方法在rails 3中的UserSession類中,這是一個常見的已知問題。但代碼如下所示: if object.respond_to?(:persisted?)&& object.persisted? 爲什麼這會失敗呢? – TheTFo 2011-02-23 05:20:55

+0

在Authlogic中是...對不起。 – TheTFo 2011-02-23 05:26:52

1

我相信你會遇到評估訂單問題。考慮以下內容:

Object.respond_to? :hello && true 
-3

如果您正在使用if語句檢查某些事情的條件,那麼您正在查找布爾響應。 Object.hello不返回false,因爲該方法不存在。您的支票:

Object.respond_to? :hello 

雖然正在檢查該響應。不應該有任何理由,在我的選擇第二個Object.hello。

+0

我不確定我明白你在這裏說什麼。我的代碼行的想法是沿着「如果方法你好存在的對象,執行它」的話說。然而,它不存在,respond_to返回false,因此Object.hello不應該被執行,並且不應該給我一個錯誤說該方法不存在。這是respond_to的整點,不是嗎?我見過這個原因至少有一個問題在軌道上。 – TheTFo 2011-02-23 05:10:54

+0

順便說一句,我使用方法respond_to?,而不是response_to? – TheTFo 2011-02-23 05:12:41

+0

我爲拼寫錯誤表示歉意 - 已經很晚了。由於缺少括號,我將它看作Object.respond_to?(:hello)&& Object.hello =這就是爲什麼我要說你會從Object.hello得到一個真/假的響應。正如接受的答案所說,這是我錯過閱讀的優先問題。很高興你找到了你的迴應。 – 2011-02-23 19:41:42

1

你有一個優先問題,邏輯與(&&)具有比方法調用,這樣你的例子是這樣執行的更高的優先級:

if Object.respond_to?(:hello && Object.hello) 

不喜歡這樣的:

if Object.respond_to?(:hello) && Object.hello 

這就是你所假設的。