2012-03-05 21 views
9

Phải dễ dàng. Tôi nghĩ, từ việc đọc this blog post rằng tôi có thể trở lại một cái gì đó ngay sau khi next lệnh của tôi:đang trả lại giá trị từ 'tiếp theo' là một ý tưởng tồi?

next "new value" if axis_range == "test"

Những gì tôi thực sự muốn làm là đăng nhập lý do tiếp theo trên cùng một dòng:

next @logger.info('skipping this item because for fun') unless (elephants.size > 0)

Tôi không thể tìm thấy bất kỳ cuộc thảo luận nào về cách sử dụng này next trên ruby doc. Mã chắc chắn hoạt động. Tôi nhận ra tôi có thể làm điều này với một khối unless nhưng dòng mã đó là ngắn gọn.

Hai câu hỏi:

  • Có một tài liệu tốt hơn nơi nào đó?
  • Đây có phải là cách sử dụng next một chút kỳ quặc chứ không phải 'ruby-ish'?

Trả lời

16

"Giống như các từ khóa returnbreak, next có thể được sử dụng một mình, hoặc nó có thể được theo sau bởi một biểu thức hoặc một danh sách bằng dấu phẩy của biểu thức. Khi next được sử dụng trong vòng một, bất kỳ giá trị sau next bị bỏ qua.Trong một khối tuy nhiên biểu hiện hoặc biểu trở thành "giá trị trả về" của tuyên bố yield mà gọi khối ."(Ngôn ngữ lập trình Ruby, David Flanagan & Yukihiro Matsumoto, 2008, trang 150)

Các cuốn sách cung cấp cho ví dụ này:

squareroots = data.collect do |x| 
    next 0 if x < 0 # return 0 for negative values 
    Math.sqrt(x) 
end 

và thay thế này:

squareroots = data.collect do |x| 
    if (x < 0) then 0 else Math.sqrt(x) end 
end 
+0

Giữa hai tôi muốn nói điều thứ hai dễ đọc hơn. – jcollum

+0

'squareroots = data.collect {| x | (x <0)? 0: Math.sqrt (x)} '(toán tử bậc ba tốt hơn trong trường hợp này) – ndbroadbent

+1

Trong ví dụ đầu tiên, câu lệnh' next ... 'hoạt động giống như mệnh đề bảo vệ. Tôi thích nó. Cảm ơn! – pdobb

0

Ấn tượng đầu tiên của tôi là nó khá hiển nhiên khi từ khóa next làm trong ngữ cảnh của vòng lặp - đó là điều tốt. Thực tế là "new value" là kết quả của next "new value" hơi căng, nhưng tôi có thể đến đó.

Điều gì khiến tôi tắt là next @logger.info('skipping this item because for fun') có thể khó hiểu. Nó thực sự không hiển nhiên rằng kết quả của các cuộc gọi info sẽ được trả lại bởi next và tôi tin rằng rất nhiều devs sẽ nhận được ném ra bởi nó.

Mặc dù mã có thể súc tích hơn nhưng khó hiểu. Tôi sẽ bình luận về những gì mã đang làm hoặc đi với cái gì khác.

Tuy nhiên, hãy gọi điện cho hai câu hỏi của bạn. Tôi rất vui khi trở thành nhà phát triển duy trì mã của bạn với kiểu suy nghĩ đó!

+0

Cám ơn những lời khen – jcollum

0

Tôi sẽ không có vấn đề với nó trừ khi nó ở ngay giữa rất nhiều mã phức tạp khác (tôi cố gắng trung bình 2 LOC cho mỗi phương pháp, thường là một hoặc hai dài 4-8 dòng, và một nhóm chỉ có một dòng, lấy trung bình ra).

Nếu mã này dài và khó hiểu, tôi đã có rất nhiều thành công khi đưa phương thức này vào đối tượng của chính nó. Tôi chỉ có phương thức khởi tạo một số đối tượng thực hiện nhiệm vụ của nó và yêu cầu nó cho kết quả, sau đó mã có thể đơn giản hơn nhiều, thường giảm vòng lặp thành một hoặc hai dòng và cho phép nó có phương thức ghi nhật ký này, sau đó bạn có thể xử lý bằng một cuộc gọi đơn giản tới log_error hoặc bất kỳ tên nào bạn cho là phù hợp.

Những ngày này tôi xem các phương pháp thủ tục phức tạp là một mùi mà có một đối tượng mang thai trong phương pháp này.

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