2011-10-19 41 views
8

Trong khối IF tôi cần kiểm tra xem có điều kiện nào đúng không và nếu có, hãy thoát khỏi khối.Ruby - thoát khỏi khối IF

#something like this 
if 1 == 1 
    return if some_object && some_object.property 
    puts 'hello' 
end 

Tôi có thể làm như thế nào?

Trả lời

12

Bạn có thể không phá vỡ ra khỏi một số if như thế. Những gì bạn có thể làm là thêm một tiểu khoản để nó:

if (cond1) 
    unless (cond2) 
    # ... 
    end 
end 

Nếu bạn đang gặp vấn đề với logic của bạn quá lồng nhau và bạn cần một cách để làm phẳng nó ra tốt hơn, có lẽ những gì bạn muốn làm là tính toán một biến trước tay và sau đó chỉ lặn nhập nếu bạn cần phải:

will_do_stuff = cond1 
will_do_stuff &&= !(some_object && some_object.property) 

if (will_do_stuff) 
    # ... 
end 

có một số cách để tránh có một cấu trúc lồng nhau mà không cần phải break nó.

+2

+1 để tính toán biến trước, cho phép đặt tên cho điều kiện. Một cái tên tốt sẽ giúp cải thiện khả năng đọc. –

+0

Tôi khuyên bạn nên tránh điều này và xác định nhiều phương pháp hơn nếu bạn cần. Đây là mẫu Rails sử dụng và nó hoạt động rất tốt. Chia nhỏ các phương thức để làm điều nguyên tử nhất mà bạn có thể sống - trong trường hợp này, một phương thức khác (private?) Trong cùng một lớp/đối tượng có thể được sử dụng để kiểm tra điều kiện này. Ví dụ. 'def will_parse? (obj); obj.nil? && obj.respond_to? (: parse) && obj.is_ready_and_willing ?; end' – coreyward

+0

"&& =" là gì? –

2

Sử dụng dịch vụ chăm sóc trong việc chọn những từ bạn kết hợp với mọi thứ. Bởi vì Ruby có khối, tôi không chắc liệu bạn có ấn tượng rằng câu lệnh có điều kiện là một khối không. Bạn có thể không, ví dụ, làm như sau:

# will NOT work: 
block = Proc.new { puts "Hello, world." } 
if true then block 

Nếu bạn cần phải có một điều kiện lồng nhau, bạn có thể làm điều đó mà không làm phức tạp mọi thứ bất kỳ:

if condition_one? 
    if condition_two? 
    # do some stuff 
    end 
else 
    # do something else 
end 
+0

Đây là một chút gây hiểu nhầm, bởi vì nếu bạn thay đổi dòng thứ hai của đoạn mã đầu tiên đó thành 'if true thì block.call end' thì nó sẽ hoạt động – DaveMongoose

+0

@DaveMongoose Đó là vì bạn đang gọi phương thức 'gọi' trên một Proc dụ, nhưng cảm ơn cho downvote – coreyward

+0

là có một ví dụ truy cập của một cái gì đó trong ruby ​​đó là một khối nhưng có thể được thay thế cho một trường hợp proc (như 'khối')? Tôi nghĩ rằng cú pháp yêu cầu nó phải là '& block' nếu bạn đang sử dụng nó thay cho một khối rõ ràng. – DaveMongoose

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