2009-05-15 33 views
5

Các mã sau hoạt động tốt:Tại sao từ khóa trả về lại gây ra vấn đề trong 'if block' của tôi?

person = {:a=>:A, :b=>:B, :c=>:C} 
berson = {:a=>:A1, :b=>:B1, :c=>:C1} 

kerson = person.merge(berson) do | key, oldv, newv | 
if key == :a 
    oldv 
elsif key == :b 
    newv 
else 
    key 
end 
end 

puts kerson.inspect 

nhưng nếu tôi thêm return bên trong "nếu khối", tôi nhận được một lỗi:

person = {:a=>:A, :b=>:B, :c=>:C} 
berson = {:a=>:A1, :b=>:B1, :c=>:C1} 

kerson = person.merge(berson) do | key, oldv, newv | 
if key == :a 
    return oldv 
elsif key == :b 
    return newv 
else 
    return key 
end 
end 

puts kerson.inspect 

Các lỗi từ mã trên là:

unexpected return (LocalJumpError) 

Có ai có thể giải thích điều này không? Tôi nghĩ rằng return có thể được sử dụng tùy ý bất cứ nơi nào đã có giả định về một giá trị được trả về.

Trả lời

12

Lý do cho lỗi là các khối không thực sự có phạm vi riêng của chúng mà chúng trở về từ - một trở về từ một khối tương đương với việc trả về từ phương thức xung quanh. Phương pháp xung quanh ở đây là gì? Không có gì - nó ở cấp cao nhất, vì vậy nó tương đương với việc thực hiện ruby -e "return", điều này sẽ cho bạn cùng một lỗi. Nếu bạn gắn nó vào bên trong một phương thức, nó sẽ làm cho phương thức trả về giá trị của nhánh đầu tiên của mệnh đề if được thực thi.

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