ฉันไม่มีประสบการณ์ใน Ruby ดังนั้นรหัสของฉันจึงรู้สึก "น่าเกลียด" และไม่ใช่สำนวน:
def logged_in?
!user.nil?
end
ฉันอยากจะมีสิ่งที่ชอบ
def logged_in?
user.not_nil?
end
แต่ไม่พบวิธีการดังกล่าวที่ตรงข้าม nil?
ฉันไม่มีประสบการณ์ใน Ruby ดังนั้นรหัสของฉันจึงรู้สึก "น่าเกลียด" และไม่ใช่สำนวน:
def logged_in?
!user.nil?
end
ฉันอยากจะมีสิ่งที่ชอบ
def logged_in?
user.not_nil?
end
แต่ไม่พบวิธีการดังกล่าวที่ตรงข้าม nil?
คำตอบ:
เมื่อคุณใช้ ActiveSupport มีuser.present? http://api.rubyonrails.org/classes/Object.html#method-i-present%3Fเพื่อตรวจสอบว่าไม่ใช่ศูนย์ทำไมไม่ใช้
def logged_in?
user # or !!user if you really want boolean's
end
false.present? == false !false.nil? == true
ดูเหมือนคุณจะกังวลกับบูลีนมากเกินไป
def logged_in?
user
end
หากผู้ใช้เป็นศูนย์แล้ว logged_in? จะส่งคืนค่า "falsey" มิฉะนั้นจะส่งคืนวัตถุ ใน Ruby เราไม่จำเป็นต้องส่งคืนจริงหรือเท็จเนื่องจากเรามีค่า "จริง" และ "เท็จ" เหมือนใน JavaScript
อัปเดต
หากคุณใช้ Rails คุณสามารถทำให้สิ่งนี้อ่านได้ดีขึ้นโดยใช้present?วิธีการ:
def logged_in?
user.present?
end
?คือมันส่งคืนบูลีน !!valueเป็นวิธีคลาสสิกในการแปลงอะไรเป็นบูลีน ไม่เหมือนกันObject#present?ทุกประการแต่ในกรณีนี้ใน RoR ก็ดีเช่นกัน
ระวังคำตอบอื่น ๆ ที่นำเสนอ present?ที่เป็นคำตอบสำหรับคำถามของคุณ
present? ตรงกันข้ามกับ blank?ในราง
present?ตรวจสอบว่ามีค่าที่มีความหมายหรือไม่ สิ่งเหล่านี้อาจทำให้การpresent?ตรวจสอบล้มเหลว:
"".present? # false
" ".present? # false
[].present? # false
false.present? # false
YourActiveRecordModel.where("false = true").present? # false
ในขณะที่!nil?เช็คให้:
!"".nil? # true
!" ".nil? # true
![].nil? # true
!false.nil? # true
!YourActiveRecordModel.where("false = true").nil? # true
nil?ตรวจสอบว่ามีวัตถุอยู่จริงnilหรือไม่ อย่างอื่น: สตริงว่าง0,falsenilสิ่งที่ไม่ได้เป็น
present? มีประโยชน์มาก แต่ไม่ตรงกันข้ามกับ nil? . การสับสนทั้งสองอย่างอาจนำไปสู่ข้อผิดพลาดที่ไม่คาดคิด
สำหรับกรณีการใช้งานของคุณจะใช้present?งานได้ แต่ควรตระหนักถึงความแตกต่างอยู่เสมอ
false.blank?ไม่เหมือนกับfalse.nil?
present?จะค้นหาฐานข้อมูลของคุณnil?จะไม่ระวังด้วย
บางทีนี่อาจเป็นแนวทาง:
class Object
def not_nil?
!nil?
end
end
!self.nil?เป็นอย่างนั้น!nil?หรือselfโดยปริยาย?
ฉันขอเสนอวิธี Ruby-esque !เกี่ยวกับผลลัพธ์จากnil?วิธีการ
def logged_in?
user.nil?.!
end
เป็นความลับที่ RubyMine IDE จะตั้งค่าสถานะเป็นข้อผิดพลาด ;-)
คุณสามารถใช้สิ่งต่อไปนี้:
if object
p "object exists"
else
p "object does not exist"
end
สิ่งนี้ไม่เพียง แต่ใช้ได้กับศูนย์ แต่ยังเป็นเท็จเป็นต้นดังนั้นคุณควรทดสอบเพื่อดูว่าใช้งานได้จริงหรือไม่ในกรณีของคุณ
ฉันมาถึงคำถามนี้โดยมองหาวิธีวัตถุเพื่อที่ฉันจะได้ใช้Symbol#to_procชวเลขแทนการบล็อก ผมพบว่าค่อนข้างอ่านได้มากขึ้นกว่าarr.find(&:not_nil?)arr.find { |e| !e.nil? }
วิธีที่ฉันพบคือObject#itself. ในการใช้งานของฉันฉันต้องการที่จะหาค่าในกัญชาสำหรับคีย์ซึ่งในบางกรณีที่สำคัญได้รับทุนบังเอิญเป็นname Nameซับเดียวนั้นมีดังนี้:
# Extract values for several possible keys
# and find the first non-nil one
["Name", "name"].map { |k| my_hash[k] }.find(&:itself)
ดังที่ระบุไว้ในคำตอบอื่น ๆสิ่งนี้จะล้มเหลวอย่างไม่น่าเชื่อในกรณีที่คุณกำลังทดสอบบูลีน
my_hash.values_at("Name", "name").findอย่างไร?
mapที่ฉันลบออกเพื่อความเรียบง่ายในตัวอย่างนี้ดังนั้นสิ่งที่เขียนไว้ที่นี่จึงสามารถใช้แทนกันvalues_atได้ findส่วนที่สำคัญคือสิ่งที่ได้รับการส่งผ่านไปยัง
present?ต้องใช้สตริงที่ไม่ว่างเปล่า! "".nil?คืนค่าจริง แต่"".present?ส่งกลับเท็จ