2014-10-10 22 views
5

Tôi mong đợi một vòng lặp while để trả lại câu lệnh cuối cùng nó thực thi, nhưng một hàm dường như không trả về điều đó.Ruby: tại sao làm trong khi và cho đến khi không trở lại dòng cuối cùng họ thực hiện từ một chức năng?

(1) Điều này dường như làm việc ..

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

(2) này không làm việc như tôi mong đợi. Tôi mong đợi 10 được trả lại và lưu trữ vào 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 

Câu hỏi:

  • Tại sao, trong (1), không nil có được trả lại từ báo cáo kết quả chuyển nhượng?
  • Tại sao b không được chỉ định 10?

Cập nhật:

Như @DaveNewton đã đề cập, trong (1), tôi nghĩ rằng tôi đã thực hiện:

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

nhưng tôi đã thực sự làm:

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

Bạn làm những việc khác nhau. * (1) * nhận một 'nil' và hiển thị nó, do đó, * (2) *.Trong * (1) * bạn đang tăng một biến cục bộ, 'counter', và hiển thị nó. Trong * (2) * bạn đặt một biến cục bộ 'b' thành kết quả trả về gọi' increment', là 'nil'. –

+0

Rất tiếc. Cảm ơn @DaveNewton cho miếng ngon đó! – kubasub

Trả lời

5

Trong cả hai ví dụ của bạn, vòng lặp while lặp lại ts là nil.

Từ while loop:

Kết quả của một vòng lặp whilenil trừ break được sử dụng để cung cấp một giá trị.

Cùng cho until:

Giống như một vòng lặp while kết quả của một vòng lặp untilnil trừ break được sử dụng. câu trả lời

+0

@KubaSub 'a' có giá trị của phép gán' counter + = 1', không phải là vòng lặp 'while'. –

+0

cảm ơn bạn đã làm rõ! – kubasub

0

Bổ sung Yu Hao là câu trả lời cho câu hỏi this trong đó nêu

Bất kỳ tuyên bố trong ruby ​​trả về giá trị của biểu thức đánh giá cuối cùng.

và sau logic rằng nếu bạn thay đổi mã của bạn để (không nói rằng đây là thực hành tốt hay túng nó, chỉ là ví dụ):

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

b = increment(10) 

Nó sẽ đưa ra 10

Các vấn đề liên quan