2016-12-29 16 views
10

Trong ngôn ngữ Ruby các công việc sau trong IRBRuby cho lỗi vòng lặp với {} khối delimiter

for fruit in ['apple', 'banana', 'cherry', 'date'] do 
    puts fruit 
end 

nhưng điều này không làm

# error 
for fruit in ['apple', 'banana', 'cherry', 'date'] { puts fruit } 

xin lưu ý để tham khảo delimiters khối sau làm không phải lỗi

5.times do |i| 
    puts "hello "+i.to_s 
end 

5.times { |i| puts "hello "+i.to_s } 

Chỉnh sửa: Tôi đoán những gì tôi đang quan sát là không nhất quán với cách kết thúc là thay thế ed cho {} ai đó có thể giải thích lý do tại sao hoặc vui lòng chỉ ra lỗi của tôi?

+0

không biết tại sao, nhưng có một hạn chế tương tự trong 'tinh chỉnh do' là tốt. –

+0

Nếu có bất kỳ sự an ủi nào, bạn không cần mở 'do' trong vòng lặp' for'. –

+0

Điều này có thể liên quan đến thực tế là 'for' và' while' (hoạt động như 'for') không phải là phương thức. Nhưng tôi đang chờ một lý do chính thức. –

Trả lời

10

Các trích dẫn sau đây từ this bài giải thích sự "mâu thuẫn" tốt (tôi nhấn mạnh):

end là một từ khóa chung chung rằng kết thúc một ngữ cảnh (điều kiện, lớp và module định nghĩa, định nghĩa phương pháp, vòng và ngoại lệ -câu lệnh [báo cáo]). Niềng răng xoăn là cú pháp đặc biệt để xác định các khối hoặc Hashes.

vòng là cấu trúc điều khiển - không phải là phương pháp có đối số khối - vì vậy chúng phải được đóng bằng từ khóa end. Các phương thức như Enumerable#timesEnumerable#each có đối số khối có thể được xác định bằng một trong hai cú pháp { } hoặc do ... end.

+0

câu trả lời tuyệt vời! Cảm ơn. – PrimeLens

0

for không phải là phương pháp được xác định cho Object hoặc trong Kernel và không mong đợi một khối.

Bạn không thể viết:

class A { 
    def method { 
    } 
} 

một trong hai.

Bạn có thể xác định một tùy chỉnh my_for phương pháp:

module Kernel 
    def my_for(elements, &block) 
    elements.each(&block) 
    end 
end 

my_for ['apple','banana','cherry', 'date'] do |fruit| 
    puts fruit 
end 

my_for ['apple','banana','cherry', 'date'] { |fruit| puts fruit } 
+1

'for ... in' là một biểu thức điều khiển hợp lệ trong Ruby, xem [documentation] (http://ruby-doc.org/core-2.4.0/doc/syntax/control_expressions_rdoc.html#label-for+ Vòng lặp). – cobaltsoda

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