2012-03-08 10 views
5

Jestem zaskoczony, że Ruby 1.9 (JRuby 1.6.6 (RUBY_VERSION == "1.9.2") i Ruby 1.9.3-p125) dają błąd składniowy dla puts(true and false).Dlaczego Ruby 1.9.2 podaje błąd składni dla: puts (true i false)?

Nie wiem dlaczego - na czym polega problem? Jak poprawnie napisać ten fragment kodu? puts(true && false) działa, ale czy istnieje rozwiązanie z and?

Przykład IRB sesja

1.9.3p125 :001 > puts(true and false) 
SyntaxError: (irb):1: syntax error, unexpected keyword_and, expecting ')' 
puts(true and false) 
      ^
    from /home/fr/.rvm/rubies/ruby-1.9.3-p125/bin/irb:16:in `<main>' 
1.9.3p125 :002 > puts(true && false) 
false 
=> nil 

Dzięki Mladen Jablanović uproszczenia przykładu. Stary przykład to f(true and f(false)).

+2

Spójrz na http://stackoverflow.com/questions/1426826/difference-between-and-and-in-ruby – Thilo

+1

uproszczonym przykładem byłoby 'puts (prawdziwe i fałszywe)' –

+0

Dzięki @Thilo i @Mladen. Znam operację operatorów, ale dla mnie to nie wyjaśnia tego zjawiska. Dzięki za przykład "puts", jest to o wiele prostsze. –

Odpowiedz

1

operator precedence w rubinach to && przed = przed and. Tak więc w swojej przykład stosując and, to spróbuj zrobić to (niejawny) cesja:

puts(true 

a następnie połączyć je z

false) 

poprzez and, co powoduje błąd składni. Zobacz wielką wyjaśnienie tutaj: Difference between "and" and && in Ruby?

EDIT: Nie jestem pewien, czy moja „ukryte zadanie” ma sens - myśleć o tym oświadczeniu, aby to jednoznacznie:

foo = puts(true and false) 

EDIT 2: Pamiętaj, że metoda wywołanie jest naprawdę wywoływane na obiekcie. Więc równoważne wypowiedzi dla obu przypadkach byłoby:

Object.send("puts", true && false) # this works 
Object.send("puts", true and false) # this is a syntax error 
Object.send("puts", (true and false)) # works again 

Nie jestem pewien, czy to pomaga więcej - masz rację, że jest to sprzeczne z intuicją bit. Moje rozwiązanie jest z dala od and :)

+1

To jest dla mnie tak sprzeczne z intuicją. Oznacza to, że 'i' ma niższy priorytet niż nawiasy argumentów metody. Czy jest to po prostu błąd w Ruby, czy jest za tym pojęcie, którego jeszcze nie dostaję? –

3

Chodzi o precedensami „i” i „& &” nie ma takich samych precedeces na argumentach, spróbuj użyć

f((true and f(false))) 

„i” powinien być stosowany dla czegoś takiego jak "rób rzeczy A, jeśli to działało dobrze, to rób rzeczy B", a nie dla ścisłego sprawdzania boolowskiego.

check_db(param) and connect_db(param) 
+0

Dobrze, kiedy używać "i", dziękuję. –

Powiązane problemy