2010-09-24 28 views
10
>> current_user.first_visit 
=> 0 
>> if current_user.first_visit 
>> puts "test" 
>> end 
test 
=> nil 

Neden testi yazdırmak mu ?Ruby'de neden "sıfır ise" yapamıyorum?

+0

Sorunuza yanıt alınmış gibi görünüyor ile eşleşmesi. Ancak, true/false için sayısal değerleri kullanmayı bırakmalısınız. Diliniz doğru ve yanlışsa, diliniz bunları destekliyorsa – colithium

+0

Rails tamsayı türünü genişletti. Ayrıca "eğer current_user.first_visit.zero?" – vise

+1

@vise:? '.zero' düz eski yakut şöyledir: [APIdock.com bağlantı] (http://apidock.com/ruby/v1_8_6_287/Numeric/zero%3F) –

cevap

16

Ruby sadece nilfalse analogdan olarak kabul edilebilir. Hiçbir varsayım 0, "" veya []false anlamına gelir, yani == 0, .blank?, .empty?, .zero? vb

Ama nil hep false olarak davranmaz kullanmalıdır. Örneğin, dize enterpolasyondaki, .to_s yöntem FalseClass ve NilClass için farklı çalışır #{} içerikleri, uygulanır:

irb(main)> "qwe #{false} rty" 
=> "qwe false rty" 
irb(main)> "qwe #{nil} rty" 
=> "qwe rty" 
+1

Lütfen unutmayın '.blank? ',' .empty?', Rails framework ("activesupport" aracılığıyla) tarafından sağlanan ve Ruby Standard veya Core Lib'de mevcut olmayan uzantılardır. Ayrıca farklı davranış, "# {false}", "to_s" yöntemini çağırmasıdır. – Swanand

+2

@swanand:? 'Boş' sıfır 've' çekirdek lib vardır (fakat aklındaki hangi sınıflar emin değilim). –

+0

@ pdom'ın düzenlemesi doğruydu. IDK, neden diğerleri reddetti? http://stackoverflow.com/review/suggested-edits/7845176 – Nakilon

6
Ruby'nin eğer bir boolean veya kullanılabilirliği ait için ya sınanması olarak düşünebiliriz

veri (vs nil). C tarafından desteklenen ve 0'dan yanlış olan (C++ gibi diğer dillere ait) örtük örtük dönüşüm, C'nin farklı bir boole türüne sahip olmasından önceki günlerden daha fazla tarihsel bir eserdi. Orada, uygun bir sentinel değeri veya sezgisel bir anlamı olan 0'a dayanır. Pek çok şey için (ör., Giyim boyutlarının 0 ila 8 arasında olduğu bazı ülkeler, POSIX libC işlev çağrısı sonuçları) sıfır, mantıksal olarak eşdeğer bir boole dönüştürülmez, bu yüzden Ruby kendi yoluna gitmesi kötü bir şey değildir. Bu açıdan

Kodunuzla ilgili sorun o current_user.first_visit olduğunu - adını bir boolean türü ima - aslında 0 tutan ve yanlış değil. Açıkça sayısal current_user.visit_counter olsaydı Alternatif olarak, birini kullanmak doğal ve doğru olacaktır: sayısal değerler kontrol edilirken Deneyebilirsin

current_user.visit_counter > 0 
current_user.visit_counter >= 1 
current_user.visit_counter != 0 
1

bu

>> current_user.first_visit 
=> 0 
>> if current_user.first_visit != 0 
>> puts "test" 
>> else 
>> puts "fail" 
>> end 
fail 
=>nil 

da gerek beklenen değer

İlgili konular