ฉันใช้รหัสต่อไปนี้เพื่อตรวจสอบว่าตัวแปรไม่เป็นศูนย์หรือไม่เป็นศูนย์
if(discount != nil && discount != 0)
...
end
มีวิธีที่ดีกว่าในการทำเช่นนี้?
discount
เป็นเท็จ?
discount.in? [0, nil]
เป็นวิธีที่สะอาดกว่าที่เป็นไปได้
ฉันใช้รหัสต่อไปนี้เพื่อตรวจสอบว่าตัวแปรไม่เป็นศูนย์หรือไม่เป็นศูนย์
if(discount != nil && discount != 0)
...
end
มีวิธีที่ดีกว่าในการทำเช่นนี้?
discount
เป็นเท็จ?
discount.in? [0, nil]
เป็นวิธีที่สะอาดกว่าที่เป็นไปได้
คำตอบ:
เว้นแต่จะมีส่วนลด || ส่วนลด == 0 # ... ปลาย
The and and or keywords are banned. It's just not worth it. Always use && and || instead.
ยืน และมันก็ถูกต้องด้วยเหตุผลของเดวิดและทอม
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
ระวังการปฏิเสธความรับผิดชอบตามปกติ ... พลังอันยิ่งใหญ่ / ความรับผิดชอบการปะลิงที่นำไปสู่ด้านมืด ฯลฯ
ตกลงหลังจาก 5 ปีผ่านไป ....
if discount.try :nonzero?
...
end
เป็นสิ่งสำคัญที่จะต้องทราบว่าtry
มีการกำหนดไว้ในอัญมณี ActiveSupport ดังนั้นจึงไม่สามารถใช้ได้ในทับทิมธรรมดา
try
วิธี
try
แสดงตัวเลือกอื่น (นี่คือเหตุผลว่าทำไม upvoted ตั้งแต่แรก!) ตราบใดที่ชัดเจน ผู้อ่านที่ActiveSupport
ไม่ใช่ทับทิมวานิลลา
ยกเว้น [nil, 0] .include (ลดราคา) # ... ปลาย
จากทับทิม 2.3.0 เป็นต้นไปคุณสามารถรวมผู้ประกอบการนำทางที่ปลอดภัย ( &.
) Numeric#nonzero?
ด้วย &.
ส่งคืนnil
ถ้าอินสแตนซ์เคยเป็นnil
และnonzero?
- ถ้าจำนวนเดิมคือ0
:
if discount&.nonzero?
# ...
end
หรือ postfix:
do_something if discount&.nonzero?
"foo"&.nonzero? # => NoMethodError: undefined method 'nonzero?' for "foo":String
.... สิ่งนี้ไม่ปลอดภัยที่จะใช้กับวัตถุใด ๆ
nil
เช่นนั้น
nonzero?
- ถ้าตัวเลขเป็น0
" นอกจากนี้ยังจำเป็นที่จะต้องตรวจสอบว่าวัตถุพลสมบูรณ์เกิดขึ้นไม่ค่อยมากเมื่อเทียบกับการตรวจสอบตัวเลขที่อาจจะหรืออาจจะไม่0
nil
ดังนั้นมันจึงมีความหมายโดยนัย แม้ว่าจะมีใครบางคนทำให้สมมติฐานตรงกันข้ามพวกเขาจะเข้าใจได้ทันทีว่าเกิดอะไรขึ้นเมื่อพยายามดำเนินการ
คุณสามารถทำได้:
if (!discount.nil? && !discount.zero?)
คำสั่งซื้อมีความสำคัญที่นี่เพราะถ้าdiscount
เป็นnil
เช่นนั้นจะไม่มีzero?
วิธีการ การประเมินการลัดวงจรของรูบี้ควรป้องกันมิให้พยายามประเมินdiscount.zero?
อย่างไรก็ตามหากdiscount
เป็นnil
เช่นนั้น
คุณสามารถแปลงแถวที่ว่างเปล่าของคุณเป็นค่าจำนวนเต็มและตรวจสอบศูนย์ได้หรือไม่
"".to_i.zero? => true
nil.to_i.zero? => true
if discount and discount != 0
..
end
การปรับปรุงก็จะfalse
สำหรับdiscount = false
คุณสามารถใช้ประโยชน์จากวิธีการที่NilClass
มีให้#to_i
ซึ่งจะส่งกลับค่าศูนย์nil
:
unless discount.to_i.zero?
# Code here
end
หากdiscount
สามารถเป็นเศษส่วนคุณสามารถใช้#to_f
แทนเพื่อป้องกันการปัดเศษให้เป็นศูนย์
"".to_i == "foo".to_i == "0".to_i == 0
. วิธีการของคุณจะทำการข่มขู่ประเภทโดยไม่ตั้งใจทุกประเภท นอกจากนี้ยังจะล้มเหลวด้วยNoMethodError
ถ้าไม่ตอบสนองต่อdiscount
to_i
def is_nil_and_zero(data)
data.blank? || data == 0
end
ถ้าเราผ่าน "" มันจะคืนค่าเท็จในขณะที่ว่างเปล่า ผลตอบแทนจริง เป็นกรณีเดียวกันเมื่อ data = false ว่างเปล่า? คืนค่าจริงสำหรับ nil, false, empty หรือสตริงช่องว่าง ดังนั้นจะดีกว่าถ้าใช้เปล่า? วิธีการเพื่อหลีกเลี่ยงสตริงว่างเช่นกัน
blank?
เป็นวิธีเฉพาะทางรถไฟและไม่สามารถใช้ได้ในวานิลลาทับทิม
เมื่อจัดการกับบันทึกฐานข้อมูลฉันต้องการเริ่มต้นค่าว่างทั้งหมดด้วย 0 โดยใช้ผู้ช่วยการโยกย้าย:
add_column :products, :price, :integer, default: 0
คุณสามารถเริ่มต้นส่วนลดเป็น 0 ได้หากรหัสของคุณรับประกันว่าจะไม่ลองใช้ก่อนที่จะเริ่มต้น ที่จะลบหนึ่งเช็คฉันคิดว่าฉันไม่สามารถคิดอะไรอีก
if discount.nil? || discount == 0
[do something]
end
ฉันชอบใช้วิธีที่สะอาดกว่า:
val.to_i.zero?
val.to_i
จะกลับ0
ถ้าValเป็นnil
,
หลังจากนั้นสิ่งที่เราต้องทำคือตรวจสอบว่าค่าสุดท้ายเป็นศูนย์หรือไม่
ทางเลือกอื่นคือใช้การปรับแต่งเช่น:
module Nothingness
refine Numeric do
alias_method :nothing?, :zero?
end
refine NilClass do
alias_method :nothing?, :nil?
end
end
using Nothingness
if discount.nothing?
# do something
end
ฉันเชื่อว่าต่อไปนี้ดีพอสำหรับรหัสทับทิม ฉันไม่คิดว่าฉันสามารถเขียนการทดสอบหน่วยที่แสดงความแตกต่างระหว่างสิ่งนี้กับแบบดั้งเดิม
if discount != 0
end
true
ว่าเป็นส่วนลดnil
หรือไม่