2012-05-10 39 views
27

Tôi nghĩ đó là ý nghĩa chỉ chung và ước Ruby để làm điều này nhưng tôi có phương pháp này:Phương pháp có nên kết thúc bằng không? (dấu chấm hỏi) chỉ trả về một boolean?

def is_subscribed?(feed_url) 
    Subscription.find_by_user_id_and_feed_id(self[ :id ], Feed.find_by_feed_url(feed_url)) 
end 

Sự rắc rối duy nhất tôi nhận được, điều này không trở boolean như tôi dự đoán ban đầu bằng cách đặt câu hỏi đánh dấu vào cuối tên phương thức. Tôi đã có ấn tượng rằng khi đánh giá một đối tượng như điều kiện, nó trả về true nếu không phải là nil.

Dường như tôi đang thiếu điểm ở đây và nó không đánh giá nó như tôi nghĩ.

Vì vậy, câu hỏi của tôi là, tốt nhất là chỉ cần thực hiện một số if (condition) true else false? Hoặc là có một phương pháp thanh lịch hơn để làm điều này?

Trả lời

27

Phương pháp kết thúc bằng? phải trả về một giá trị có thể được đánh giá là đúng hoặc sai. Nếu bạn muốn đảm bảo trả về boolean, bạn có thể làm như vậy bằng cách thêm một cú đúp vào công cụ tìm.

def is_subscribed?(feed_url) 
    !!Subscription.find_by_user_id_and_feed_id(self[ :id ], Feed.find_by_feed_url(feed_url)) 
end 
+0

tuyệt vời chỉ là những gì tôi đang tìm kiếm. –

+6

Là một sang một bên, có lẽ phương pháp nên được đặt tên là "đã đăng ký?". "?" đã truyền đạt ý nghĩa của "là". – Salil

+2

"một giá trị có thể được đánh giá là đúng hoặc sai", nhưng bất kỳ và mọi giá trị trong Ruby không đánh giá 'true' hoặc' false' ... –

5

Nó nên một giá trị 'truthy' hoặc 'falsy', mà có thể được sử dụng an toàn trong các vị từ, nhưng không nhất thiết phải trở lại đen true hoặc false. Thậm chí còn có các phương pháp như thế này, như File.size?, trong thư viện chuẩn.

2

Thực ra, để cụ thể - các phương thức kết thúc bằng dấu chấm hỏi phải trả về các giá trị có thể được kiểm tra là true hoặc false.

Có nhiều phương pháp trong đường ray trả lại giá trị không boolean từ '?' phương pháp.

thời gian gần đây Trong thực tế đã có một yêu cầu kéo nộp cho dự án đường ray mà tập trung chú ý vào vấn đề chính xác này:

https://github.com/rails/rails/pull/5582

Về cơ bản, các cuộc thảo luận là xung quanh vấn đề này chính xác - Phương pháp chỉ cần phải trả lại giá trị có thể được kiểm tra là đúng hay sai, như vậy:

if (condition) 
    # do 'truthy option 
else 
    # do non-truthy option 
end 

Từ quan điểm đó, tôi tin rằng phương pháp của bạn là tốt.

14

Thêm ? vào cuối tên phương thức không theo bất kỳ cách nào thay đổi giá trị trả về của phương thức, nhưng thay vào đó chỉ cho biết đó là phương pháp dự báo biến vị ngữ. Nghĩa là, giá trị trả về của phương thức phải được coi là boolean, nhưng không cần phải là boolean nghiêm ngặt (tức là true hoặc false).

Nhiều câu trả lời khác cho biết rằng câu trả lời phải trả về giá trị trung thực hoặc giả. Điều này khá dư thừa, vì mọi thứ có thể là trung thực hoặc giả, và vì tất cả các phương thức trong Ruby trả lại một cái gì đó (trừ khi chúng tăng ngoại lệ), giá trị trả về là luôn là đúng hay sai.

Hãy suy nghĩ phụ thêm ? làm phương án thay thế đẹp hơn để thêm is_ bằng các ngôn ngữ khác; ví dụ. Tôi có thể có subscribed? hoặc is_subscribed.

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