2016-09-14 13 views
7

Mã này:đặt và thời gian phương pháp trên số

puts 1.times { puts 2.times { puts 3.times { puts 4 } } } 

Đầu ra này:

4 4 4 3 4 4 4 3 2 1 

Tôi mong chờ Ruby để ra giá trị trả về của phương pháp times, nhưng nó dường như không làm việc đó đi. Nó in ra số mà times đang được gọi. Điều gì đang xảy ra?

Trả lời

3

tôi không thực sự có được sản lượng mà một trong hai, vì vậy chúng ta hãy phân tích nó, bắt đầu với biểu hiện trong cùng:

puts 4 
# 4   <- this should denote output 
#=> nil  <- this should denote return value 

It in 4 và trả nil (puts luôn trả nil).

gói nó trong 3.times { ... } in 4 3 lần:

3.times { puts 4 } 
# 4 
# 4 
# 4 
#=> 3 

Nhưng thay vì trả lại nil, nó sẽ trả 3. Điều này là do times luôn trả về người nhận (tức là số nguyên bạn gọi times).

Bây giờ chúng ta hãy thêm puts khác:

puts 3.times { puts 4 } 
# 4 
# 4 
# 4 
# 3 
#=> nil 

Tương tự như trên, nhưng cũng in kết quả của 3.times { ... }, ví dụ: 3.

Bao bì tất cả mọi thứ trong 2.times { ... } bản sao kết quả trên:

2.times { puts 3.times { puts 4 } } 
# 4 
# 4 
# 4 
# 3 
# 4 
# 4 
# 4 
# 3 
#=> 2 

Nó cũng trả về 2 thay vì nil2.times { ... }.

Thêm puts in rằng 2:

puts 2.times { puts 3.times { puts 4 } } 
# 4 
# 4 
# 4 
# 3 
# 4 
# 4 
# 4 
# 3 
# 2 
#=> nil 

Wrapping này trong 1.times { ... } sẽ cho kết quả tương tự, nhưng thay đổi kết quả nil-1:

1.times { puts 2.times { puts 3.times { puts 4 } } } 
# 4 
# 4 
# 4 
# 3 
# 4 
# 4 
# 4 
# 3 
# 2 
#=> 1 

Thêm puts in trước rằng 1:

puts 1.times { puts 2.times { puts 3.times { puts 4 } } } 
# 4 
# 4 
# 4 
# 3 
# 4 
# 4 
# 4 
# 3 
# 2 
# 1 
#=> nil 
+0

Ah Gotcha. Không nhận ra rằng phương thức 'times' trả về người nhận. Làm cho cảm giác bây giờ. Cảm ơn sự cố chi tiết! – breed

7

Bạn có vòng lặp (quasi) trong vòng lặp trong vòng một vòng để Ruby thực hiện chính xác những gì bạn đang yêu cầu. Cách các vòng lặp này được đánh giá, nói chung, từ trong ra ngoài.

Giá trị trả lại từ times là số được cung cấp ngay từ đầu, vì vậy trả về 3.

Với tất cả những gì trong tâm trí bạn có thể giải thích những gì đang xảy ra như thế này:

4 # First iteration of 3.times { puts 4 } 
4 
4 
3 # Return value of 3.times displayed 
4 # Second iteration of 3.times { puts 4 } 
4 
4 
3 # Return value of 3.times displayed 
2 # Return value of 2.times displayed 
1 # Return value of 1.times displayed 

Bây giờ khi tôi xem mã như puts 3.times đó là thường là một sai lầm, cũng áp dụng cho puts array.each ... nơi một người nào đó có thể có nghĩa .map.

2

Tôi đoán tôi mong đợi Ruby sẽ trả về giá trị trả về của phương thức times, nhưng dường như không làm điều đó. Nó in ra số mà times đang được gọi.

That is the return value of the times method:

times {|i| block }self

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