แค่สงสัยว่า!!
ในรูบี้มีอะไร
แค่สงสัยว่า!!
ในรูบี้มีอะไร
คำตอบ:
ไม่ไม่ ใช้เพื่อแปลงค่าเป็นบูลีน:
!!nil #=> false
!!"abc" #=> true
!!false #=> false
โดยปกติแล้วไม่จำเป็นต้องใช้เนื่องจากค่าเท็จเพียงอย่างเดียวสำหรับ Ruby คือnil
และfalse
โดยปกติแล้วควรปล่อยให้การประชุมนั้นยืนอยู่ได้ดีที่สุด
คิดว่าเป็น
!(!some_val)
สิ่งหนึ่งที่ใช้เพื่อความถูกต้องคือการป้องกันไม่ให้มีการส่งคืนข้อมูลจำนวนมาก ตัวอย่างเช่นคุณอาจไม่ต้องการส่งคืนข้อมูลรูปภาพ 3MB ในhas_image?
วิธีการของคุณหรือคุณอาจไม่ต้องการส่งคืนออบเจ็กต์ผู้ใช้ทั้งหมดของคุณในlogged_in?
วิธีนี้ การใช้!!
แปลงวัตถุเหล่านี้ให้เป็นแบบง่ายtrue
/ false
.
.nil?
แทนที่จะใช้!!
? มีความแตกต่างหรือไม่?
!!true #=> true
และtrue.nil? #=> false
ก็จะส่งกลับtrue
ถ้าวัตถุด้านขวาไม่ได้nil
และไม่ได้false
, false
ถ้ามันเป็นnil
หรือfalse
def logged_in?
!!@current_user
end
!
หมายถึงลบสถานะบูลีนสอง!
วินาทีไม่มีอะไรพิเศษนอกจากการปฏิเสธสองครั้ง
!true == false
# => true
โดยทั่วไปจะใช้เพื่อบังคับให้เมธอดคืนค่าบูลีน มันจะตรวจจับความจริงประเภทใด ๆ เช่นสตริงจำนวนเต็มและสิ่งที่ไม่และเปลี่ยนเป็นบูลีน
!"wtf"
# => false
!!"wtf"
# => true
กรณีการใช้งานจริงเพิ่มเติม:
def title
"I return a string."
end
def title_exists?
!!title
end
สิ่งนี้มีประโยชน์เมื่อคุณต้องการให้แน่ใจว่ามีการส่งคืนบูลีน IMHO เป็นเรื่องที่ไม่มีจุดหมายแม้ว่าจะเห็นว่าทั้งสองอย่างif 'some string'
และif true
เป็นขั้นตอนเดียวกัน แต่บางคนพบว่ามีประโยชน์ในการส่งคืนบูลีนอย่างชัดเจน
title
ได้อาจทำสิ่งที่ใกล้เคียงที่สุดกับมันด้วยก็ได้ ... ฉันคิดว่า
โปรดทราบว่าสำนวนนี้มีอยู่ในภาษาโปรแกรมอื่นเช่นกัน C ไม่ได้มีอยู่ภายในbool
ชนิดดังนั้น booleans ทั้งหมดถูกพิมพ์เป็นint
แทนด้วยค่ายอมรับหรือ0
1
นำตัวอย่างนี้ (เพิ่มวงเล็บเพื่อความชัดเจน):
!(1234) == 0
!(0) == 1
!(!(1234)) == 1
ไวยากรณ์ "not-not" จะแปลงจำนวนเต็มที่ไม่ใช่ศูนย์เป็น 1
ที่แท้จริงของบูลีนที่ยอมรับได้
โดยทั่วไปแล้วฉันพบว่าการเปรียบเทียบที่สมเหตุสมผลดีกว่าการใช้สำนวนที่ผิดปกตินี้:
int x = 1234;
if (!!x); // wtf mate
if (x != 0); // obvious
จะมีประโยชน์หากคุณต้องการทำเอกสิทธิ์เฉพาะบุคคลหรือ . คัดลอกจากคำตอบของ Matt Van Horn โดยมีการปรับเปลี่ยนเล็กน้อย:
1 ^ true
TypeError: can't convert true into Integer
!!1 ^ !!true
=> false
ฉันใช้มันเพื่อให้แน่ใจว่าตัวแปรสองตัวเป็นทั้งสองศูนย์หรือทั้งคู่ไม่ใช่ศูนย์
raise "Inconsistency" if !!a ^ !!b
!!false # => false
ในขณะที่!false.nil? # => true
!(foo.nil? || foo == false)
- ใช้คำละเอียดมากขึ้นใช่ แต่มีความคลุมเครือน้อยกว่า
การทำความเข้าใจวิธีการทำงานจะมีประโยชน์หากคุณต้องการแปลงเช่นการแจงนับเป็นบูลีน ฉันมีรหัสที่ทำอย่างนั้นโดยใช้classy_enum
อัญมณี:
class LinkStatus < ClassyEnum::Base
def !
return true
end
end
class LinkStatus::No < LinkStatus
end
class LinkStatus::Claimed < LinkStatus
def !
return false
end
end
class LinkStatus::Confirmed < LinkStatus
def !
return false
end
end
class LinkStatus::Denied < LinkStatus
end
จากนั้นในรหัสบริการฉันมีตัวอย่างเช่น:
raise Application::Error unless !!object.link_status # => raises exception for "No" and "Denied" states.
ตัวดำเนินการ bangbang อย่างมีประสิทธิภาพกลายเป็นสิ่งที่ฉันอาจเขียนเป็นวิธีการที่เรียกว่า to_bool
คำตอบอื่น ๆ ได้กล่าวถึงสิ่งที่!!
ทำและการปฏิบัติที่ดีหรือไม่
อย่างไรก็ตามไม่มีคำตอบใดที่ให้ "วิธี Ruby มาตรฐาน" ในการส่งค่าเป็นบูลีน
true & variable
TrueClass
คลาสของค่า Ruby true
ใช้เมธอด&
ซึ่งมีเอกสารดังนี้:
ผลตอบแทน
false
ถ้าobj
เป็นnil
หรือfalse
,true
มิฉะนั้น
เหตุใดจึงต้องใช้การลบล้างสองครั้งที่สกปรกเมื่อคุณครอบคลุมไลบรารีมาตรฐาน