Tôi đang sử dụng đoạn mã sau để kiểm tra xem một biến có phải không và không bằng không
if(discount != nil && discount != 0)
...
end
Có cách nào tốt hơn để làm điều này?
discountsai?
discount.in? [0, nil]cách sạch hơn có thể
Tôi đang sử dụng đoạn mã sau để kiểm tra xem một biến có phải không và không bằng không
if(discount != nil && discount != 0)
...
end
Có cách nào tốt hơn để làm điều này?
discountsai?
discount.in? [0, nil]cách sạch hơn có thể
Câu trả lời:
trừ khi giảm giá. | | giảm giá == 0 # ... kết thúc
The and and or keywords are banned. It's just not worth it. Always use && and || instead.. Và nó đúng, vì lý do David và Tom.
class Object
def nil_zero?
self.nil? || self == 0
end
end
# which lets you do
nil.nil_zero? # returns true
0.nil_zero? # returns true
1.nil_zero? # returns false
"a".nil_zero? # returns false
unless discount.nil_zero?
# do stuff...
end
Cẩn thận với những từ chối thông thường ... sức mạnh / trách nhiệm lớn, việc vá khỉ dẫn đến mặt tối, v.v.
ok, sau 5 năm trôi qua ....
if discount.try :nonzero?
...
end
Điều quan trọng cần lưu ý trylà được xác định trong đá quý ActiveSupport, vì vậy nó không có sẵn trong ruby đơn giản.
tryphương pháp.
tryhiển thị tùy chọn thay thế (đây là lý do tại sao nó được nâng cấp ở vị trí đầu tiên!), Miễn là nó rõ ràng người đọc ActiveSupportkhông phải là vani ruby.
trừ khi [không, 0]. bao gồm? (giảm giá) # ... kết thúc
Từ Ruby 2.3.0 trở đi, bạn có thể kết hợp toán tử điều hướng an toàn ( &.) với Numeric#nonzero?. &.trả về nilnếu thể hiện là nilvà nonzero?- nếu số đó là 0:
if discount&.nonzero?
# ...
end
Hoặc hậu tố:
do_something if discount&.nonzero?
"foo"&.nonzero? # => NoMethodError: undefined method 'nonzero?' for "foo":String.... Điều này không an toàn để sử dụng trên các đối tượng tùy ý.
nil.
nonzero?- nếu số đó là 0" . Ngoài ra, cần phải kiểm tra xem một đối tượng hoàn toàn tùy ý có 0phát sinh cực kỳ hiếm khi so với điều đó để kiểm tra một số có thể có hoặc không nil. Do đó nó gần như ngụ ý. Ngay cả khi ai đó bằng cách nào đó đưa ra giả định ngược lại, họ sẽ ngay lập tức hiểu những gì đang xảy ra khi họ cố gắng thực hiện nó.
Bạn có thể làm điều này:
if (!discount.nil? && !discount.zero?)
Thứ tự ở đây rất quan trọng, bởi vì nếu discountcó nilthì nó sẽ không có zero?phương thức. discount.zero?Tuy nhiên, đánh giá ngắn mạch của Ruby sẽ ngăn nó cố gắng đánh giá , tuy nhiên, nếu discountcó nil.
if discount and discount != 0
..
end
cập nhật, nó sẽ falsechodiscount = false
Bạn có thể tận dụng phương thức NilClassđược cung cấp #to_i, phương thức này sẽ trả về 0 cho nilcác giá trị:
unless discount.to_i.zero?
# Code here
end
Nếu discountcó thể là số phân số, bạn có thể sử dụng #to_fthay thế, để ngăn số được làm tròn thành số không.
"".to_i == "foo".to_i == "0".to_i == 0. Phương pháp của bạn sẽ làm cho tất cả các loại ép buộc ngoài ý muốn. Nó cũng sẽ thất bại với một NoMethodErrornếu discountkhông đáp ứng to_i.
def is_nil_and_zero(data)
data.blank? || data == 0
end
Nếu chúng ta vượt qua "" nó sẽ trả về false trong khi để trống? trả về đúng Tương tự là trường hợp khi dữ liệu = sai trống? trả về true cho nil, false, trống hoặc chuỗi khoảng trắng. Vì vậy, tốt hơn là sử dụng trống? phương pháp để tránh chuỗi rỗng là tốt.
blank?là một phương pháp dành riêng cho đường ray, và không có sẵn trong vani ruby.
if discount.nil? || discount == 0
[do something]
end
Tôi tin rằng sau đây là đủ tốt cho mã ruby. Tôi không nghĩ rằng tôi có thể viết một bài kiểm tra đơn vị cho thấy bất kỳ sự khác biệt giữa điều này và bản gốc.
if discount != 0
end
truenếu giảm giá nil.