2015-08-19 63 views
4

我嘗試比較我的Ruby應用程序中的標誌。TypeError:錯誤的參數類型與Ruby&〜運算符

我有這樣的代碼:

if self.flag &~ flag == self.flag 
     return false 

但它不會運行。我已經收窄的問題是:

irb(main):020:0> my_user.flag 
=> 1 
irb(main):021:0> flag 
=> 128 
irb(main):022:0> my_user.flag.class 
=> Fixnum 
irb(main):023:0> flag.class 
=> Fixnum 
irb(main):024:0> my_user.flag &~ flag 
TypeError: wrong argument type Fixnum (expected Proc) 

那可真是令人不安,因爲它的工作原理是這樣的:

irb(main):025:0> 1 &~ 128 
=> 1 
+0

在'my_user'類中'flag'的定義是什麼樣的? – lurker

+0

這是表格中的一列User(用Rails生成) – Mat

+3

沒有&&''操作符,'&'和'〜'是不同的操作符。 – Stefan

回答

4

1 &~ 128my_user.flag &~ flag之間的不同之處在於第二個表達式涉及點的方法調用。這改變了後續令牌的解釋方式。

試試這個:

# works 
my_user.flag() &~ flag 

# also works 
(my_user.flag) &~ flag 

# best 
my_user.flag & ~flag 

你會發現,它的工作原理。這是因爲添加()或移動~會將操作順序更改爲更符合您的預期。

最初的方法調用你使用實際上是由紅寶石解釋爲:

# bad 
my_user.flag(&(~flag)) 

此操作的順序首先通過應用~運營商在翻轉的flag位,然後試圖調用to_proc上所產生的Fixnum由於&(cast-as-block)運算符的應用,最後嘗試(如果不是則拋出TypeError)將其作爲塊參數傳遞給User#flag方法。

+2

爲什麼不簡單地使用'my_user.flag&〜flag'? – cremno

+0

確實有效。但我不太瞭解。我認爲這些列意味着被用作屬性而不是方法。不管怎麼說,還是要謝謝你。 – Mat

+0

@Mat看到我以前的評論和傑西的答案。如果沒有括號,Ruby認爲你在'User'類中爲'flag'屬性傳遞了* setter *的參數。 – lurker

相關問題