2011-11-29 61 views
4

有沒有人注意到這樣的事情?爲什麼會發生?奇怪的行爲總和在軌道上的紅寶石控制檯

ruby-1.9.2-p290 :006 > User.count 
    (0.4ms) SELECT COUNT(*) FROM "users" 
=> 102 
ruby-1.9.2-p290 :007 > User.count + 1 
    (0.4ms) SELECT COUNT(*) FROM "users" 
=> 103 
ruby-1.9.2-p290 :008 > User.count+ 1 
    (0.4ms) SELECT COUNT(*) FROM "users" 
=> 103 
ruby-1.9.2-p290 :009 > User.count+1 
    (0.4ms) SELECT COUNT(*) FROM "users" 
=> 103 
ruby-1.9.2-p290 :010 > User.count +1 
    (0.5ms) SELECT COUNT(1) FROM "users" 
=> 102 

使用ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux] & & Rails 3.1.3

額外的東西:

ruby-1.9.2-p290 :007 > "ayay".length + 1 
=> 5 
ruby-1.9.2-p290 :008 > "ayay".length +1 
ArgumentError: wrong number of arguments(1 for 0) 
    from (irb):8:in `length' 
    ... 
+1

奇怪。並且「(User.count)+1」返回「103」。順便說一句,它是可重現的紅寶石1.8.7 /導軌2.3.8,甚至在jruby /導軌3.1 – buru

回答

5

這取決於一個事實,即在Ruby中空格可以顯著。你會看到不同的結果,因爲Ruby以不同的方式解釋你的例子。所以

第一:

"ayay".length + 1 

就像

"ayay".length.+(1) 

而第二個:

"ayay".length +1 

就像

"ayay".length(+1) 

這樣你可以看到爲什麼Ruby在第二種情況下給出錯誤。

關於count問題:Ruby的解釋代碼:

User.count(+1) 

而且,正如你可以從生成的SQL看到的,是因爲+1被認爲是列名參數的差異。

+0

括號往往可以節省你:) – Bohdan

+0

是的。絕對是真的;) – lucapette

+0

謝謝你的迴應,正是我的想法。儘管如此,這似乎是一種奇怪的行爲...... – fuzzyalej