2012-05-06 31 views
6

Tôi khá mới với Ruby và Rails nhưng ngay cả sau khi tìm kiếm tràn ngăn xếp và google tôi không thể tìm thấy câu trả lời cho điều này.Biểu thức bậc ba với "được xác định?" trả về "biểu thức" thay vì giá trị?

Tôi đã có một Ruby viết tắt đơn giản nếu tuyên bố rằng sẽ trả về một integer như vậy:

# in the context of this erb document `amount` is defined as 5. 
@c = (defined? amount ? amount : r(1,4)) 

r() là một hàm helper tùy chỉnh mà trả về một số ngẫu nhiên giữa trong trường hợp này 1 và 4.

Cách tôi định làm việc này là ifamount được xác định, sau đó sử dụng số được xác định là amount, else tạo số ngẫu nhiên từ 1 đến 4 và sử dụng số đó thay thế.

Khi in ra @c tuy nhiên kết quả đầu ra của Ruby expression thay vì số.

Tôi phải làm gì để làm việc này như tôi dự định và tôi đang làm gì sai?

Rất cám ơn bạn đã đọc!

Trả lời

8

defined? được ràng buộc để amount ? amount : r(1,4) nên nó tương đương với:

defined?(amount ? amount : r(1,4)) 

Bạn có thể muốn:

defined?(amount) ? amount : r(1,4) 

Trên thực tế, tỷ lệ cược là rằng amount || r(1,4), hoặc amount.nil? ? r(1,4) : amount sẽ phù hợp tốt hơn những gì bạn muốn, vì Tôi nghĩ bạn không muốn điều này:

 
1.9.3p194 :001 > defined?(amount) 
=> nil 
1.9.3p194 :002 > amount = nil 
=> nil 
1.9.3p194 :003 > defined?(amount) 
=> "local-variable" 

... trong trường hợp này @c sẽ là nil - giá trị của biến được xác định.

+0

Hoàn hảo, cảm ơn rất nhiều! Rõ ràng là tôi vẫn chưa tìm hiểu thêm về những điều cơ bản này nhưng điều này rất hữu ích 'số tiền || r (x, y) 'hoạt động chính xác như tôi muốn và tất cả đều có ít ký tự hơn cùng một lúc. – Jannis

2

Sử dụng các nhà điều hành || trong trường hợp này:

@c = amount || r (1,4) 

Trong code của bạn, phương pháp hoạt động trên defined?amount ? amount : r(1,4) thay vì chỉ trên amount như bạn dự định. Ngoài ra, các nhà điều hành defined? có thể không làm những gì bạn mong đợi, có một cái nhìn tại đây blog entry để có được một ý tưởng.

+0

Cảm ơn! Bài đăng trên blog đó rất sáng suốt, bây giờ tôi thấy cái gì được định nghĩa? 'Thực sự hữu ích cho! – Jannis

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