ฉันไม่มีประสบการณ์ใน 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
,false
nil
สิ่งที่ไม่ได้เป็น
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?
ส่งกลับเท็จ