2012-11-03 26 views
8

Khi lập trình trong Ruby tôi khá thường xuyên có bài tập như sauRuby: Gán đầu ra của một hàm chỉ khi nó không trả lại con số không

test = some_function if some_function 

Với bài tập mà tôi muốn gán đầu ra của một chức năng, nhưng nếu nó trả về nil Tôi muốn giữ nội dung của biến. Tôi biết có các bài tập có điều kiện, nhưng không thể sử dụng ||= cũng như &&= ở đây. Cách ngắn nhất mà tôi tìm thấy để mô tả tuyên bố trên là

test = (some_function or test) 

Có cách nào tốt hơn/ngắn hơn để thực hiện việc này không?

+2

Điều quan trọng là tôi đã sử dụng phiên bản đầu tiên cho đến gần đây và đánh giá chức năng hai lần. Phiên bản thứ hai như vậy là tốt hơn. Vì tôi phải thay thế phiên bản đầu tiên trong suốt mã của mình, tôi chỉ muốn đảm bảo rằng tôi thay thế nó bằng cách tốt nhất để xử lý việc này - hoặc có thể là cách thực hành tốt nhất. –

+0

Đối với tôi, nó đáng để đặt câu hỏi khi tôi nhận được câu trả lời cho tôi biết ba điều tôi không biết về biểu hiện đơn giản đó. Đầu tiên, sử dụng '||' thay vì 'hoặc'. Thứ hai, hãy xem xét sử dụng 'hiện diện'. Thứ ba, suy nghĩ về cách tiếp cận chức năng. Đó là nhiều hơn tôi đã hy vọng. –

Trả lời

4

Tôi không nghĩ rằng có bất cứ điều gì tốt hơn so với đoạn cuối cùng bạn thấy nhưng lưu ý rằng or được sử dụng để kiểm soát dòng chảy:

test = some_function || test 

Nó thường tốt hơn để ràng buộc các giá trị mới với tên mới (đó là cách tiếp cận functional), mã kết quả là dễ hiểu và gỡ lỗi vì "biến" có giá trị trong suốt:

another_test = some_function || test 
+0

Ồ, sự hiện diện, nội dung mới :) –

+1

Với nhiều năm kinh nghiệm hơn, tôi có thể xác nhận rằng câu trả lời của tôi sai. –

0

tôi chỉ cần thêm dấu ngoặc đơn

(a = b) unless b.nil?

(a = b) if b

là kém vì nếu b là sai thì còn lại như trước

Hãy ghi nhớ rằng đây đánh giá b gấp đôi, vì vậy nếu b là một với các tác dụng phụ (chẳng hạn như thay đổi các biến ngoài phạm vi hoặc phạm vi của nó) nó sẽ làm điều đó hai lần; để tránh điều này bạn phải sử dụng

temp = b; (a = temp) unless temp.nil?

(mà có thể, tất nhiên, được chia thành)

temp = b

(a = temp) unless temp.nil?

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