2013-01-19 43 views
10

Tôi thường làmRuby/Rails sử dụng || để xác định giá trị, sử dụng một chuỗi rỗng thay vì một giá trị nil

value = input || "default" 

vì vậy nếu đầu vào = nil

value = "default" 

Nhưng làm thế nào tôi có thể làm được điều này nên thay vì nil Nó cũng đếm một chuỗi rỗng '' như nil

tôi muốn để nếu tôi làm

input = '' 
value = input || "default" 
=> "default" 

Có cách nào đơn giản để thực hiện điều này mà không cần if?

+0

Lưu ý rằng bạn đã gắn thẻ câu hỏi của mình là 'ruby-on-rails', do đó các câu trả lời cụ thể của Rails. –

+0

Có, tôi đã chạy trên đường ray nên không có vấn đề gì, tôi cũng gắn thẻ ruby ​​vì nó trông giống như một vấn đề ruby-chỉnh sửa tiêu đề để phù hợp với câu trả lời/câu hỏi tốt hơn – Akshat

Trả lời

30

Rails thêm presence phương thức cho tất cả objec t thực hiện chính xác những gì bạn muốn

input = '' 
value = input.presence || "default" 
=> "default" 

input = 'value' 
value = input.presence || "default" 
=> "value" 

input = nil 
value = input.presence || "default" 
=> "default" 
+1

Đúng, nhưng nó là _RAILS_ONLY_, 'tinh khiết' của ruby ​​không có. –

+0

Có, đó là phần mở rộng Rails, cũng như 'trống?' – dimuch

3

tôi thường làm theo cách này:

value = input.blank? ? "default" : input 

Để đối phó với các trường hợp đó đầu vào có thể không được xác định, bạn có thể bảo vệ nó bằng cách:

value = input || (input.blank? ? "default" : input) 
# I just tried that the parentheses are required, or else its return is incorrect 

Đối với ruby ​​tinh khiết (không phụ thuộc vào Rails), bạn có thể sử dụng empty?

value = input || (input.empty? ? "default" : input) 
value = (input ||= "").empty? ? "default" : input # thanks gg_s for providing this 
+0

hoạt động tuyệt vời! – Akshat

+0

Tôi có một câu hỏi khác - nó hoạt động tốt nếu chúng ta có đầu vào thực sự được định nghĩa ở đâu đó. Nhưng nếu chúng ta không làm gì? Vì vậy, tất cả chúng ta nhận được là 'biến cục bộ không xác định hoặc phương pháp'? –

+0

@DmitriyUgnichenko đã cập nhật câu trả lời, xem câu trả lời có phù hợp với bạn không :) – PeterWong

0

lẽ irrelavant nhưng tôi sẽ sử dụng Highline như thế này:

require "highline/import" 

input = ask('Input: ') { |q| q.default = "default" } 

Nó hoạt động mà không cần Rails. Giải pháp thực sự gọn gàng.

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