2014-10-10 7 views
5

Oczekuję pętli while, aby zwrócić ostatnią instrukcję, którą wykonuje, ale funkcja nie wydaje tego.Ruby: dlaczego i dopóki nie zwracają ostatniej linii, są wykonywane z funkcji?

(1) To wydaje się działać ..

[10] pry(main)> counter = 0 
=> 0 
[11] pry(main)> a = counter+=1 while counter < 10 
=> nil 
[12] pry(main)> a 
=> 10 

(2) To nie działa jak się spodziewałem. Spodziewam się, że 10 zostanie zwrócone i przechowywane w b.

[19] pry(main)> def increment(terminal_value) 
[19] pry(main)* counter = 0 
[19] pry(main)* while counter < terminal_value 
[19] pry(main)*  counter+=1 
[19] pry(main)* end 
[19] pry(main)* end 
=> :increment 
[20] pry(main)> b = increment(10) 
=> nil 
[21] pry(main)> b 
=> nil 

Pytania:

  • Dlaczego w (1), robi nil się wrócił z instrukcji przypisania?
  • Dlaczego b nie zostanie przypisany 10?

Aktualizacja:

Jak wspomniano @DaveNewton w (1), myślałem, że robi:

a = (counter +=1 while counter < 10) 

ale faktycznie robi:

(a = counter +=1) while counter < 10 
+1

Jesteś robić różne rzeczy. * (1) * pobiera 'nil' i wyświetla go, podobnie jak * (2) *.W * (1) * inkrementujesz zmienną lokalną, 'counter' i wyświetlasz ją. W * (2) * ustawiasz zmienną lokalną 'b' na wynik zwracający wartość' increment', która jest 'nil'. –

+0

Wow. Dzięki @DaveNewton za tę ciekawostkę! – kubasub

Odpowiedz

5

W obu przykładach: Rezultat pętli while ts jako nil.

Od while loop:

Wynikiem while pętli nil chyba break służy do dostarczania wartości.

To samo dotyczy until:

Jak while pętli wynikiem pętli until jest nil jeżeli nie stosuje break. Odpowiedź

+0

@KubaSub 'a' ma wartość przypisania' counter + = 1', a nie pętla 'while'. –

+0

dzięki za wyjaśnienia! – kubasub

0

uzupełnienie Yu Hao jest odpowiedź na pytanie, w którym stwierdza this

Każde oświadczenie w Ruby zwraca wartość ostatniego ocenianego wypowiedzi.

i po tej logiki, jeśli zmieni swój kod (nie mówiąc jest to dobra praktyka lub akceptowanie go, to tylko przykład):

def increment(terminal_value) 
    counter = 0 
    while counter < terminal_value 
     counter+=1 
    end 
    counter 
end 

b = increment(10) 

Będzie wyjście 10.

Powiązane problemy