ความแตกต่างระหว่าง“ กับ” และ && ในทับทิมคืออะไร?


คำตอบ:


349

andเป็นเช่นเดียว&&แต่มีความสำคัญลดลง พวกเขาทั้งสองใช้การประเมินผลการลัดวงจร

คำเตือน: andยังมีความสำคัญต่ำกว่าดังนั้นคุณมักจะต้องการที่จะหลีกเลี่ยง= andตัวอย่างเมื่อandควรใช้สามารถพบได้ในคู่มือ Rails ภายใต้ " หลีกเลี่ยงข้อผิดพลาด Double Render "


50
มันเป็นความคิดที่ดีที่จะระบุว่าปกติควรใช้&&ในขณะที่andควรใช้สำหรับกรณีเฉพาะเท่านั้น
Marc-André Lafortune

10
อีกคำอธิบายที่ดีที่นี่: devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby
Andrew Marshall

17
จากการเชื่อมโยงแอนดรูมาร์แชล: "วิธีคิดอีกเกี่ยวกับการandเป็นตรงกันข้ามifปรับปรุงคำสั่ง: next if widget = widgets.popกลายเป็นwidget = widgets.pop and nextนั่นเป็นวิธีที่ดีของการวางมันทำจริงๆมัน. 'คลิก' ในหัวของฉัน (และ. orเป็นเหมือนตรงกันข้ามunlessปรับปรุง.)
ย่า

1
รวมคำตอบนี้กับรายละเอียดของคำตอบของ tadman แล้วคุณจะได้ภาพรวมทั้งหมด
sargas

5
Avdi อัปเดตเวลาที่จะใช้และเทียบกับ && โดยทั่วไปใช้ 'และ' และ 'หรือ' สำหรับ 'การควบคุมการไหลเนื่องจากความสำคัญต่ำกว่า devblog.avdi.org/2014/08/26/...
Ericc

238

ความแตกต่างที่ใช้งานได้จริงคือความแข็งแรงของการผูกซึ่งสามารถนำไปสู่พฤติกรรมที่แปลกประหลาดหากคุณไม่ได้เตรียม:

foo = :foo
bar = nil

a = foo and bar
# => nil
a
# => :foo

a = foo && bar
# => nil
a
# => nil

a = (foo and bar)
# => nil
a
# => nil

(a = foo) && bar
# => nil
a
# => :foo

สิ่งเดียวกันที่ทำงานให้และ||or


2
a = foo and bar และ (a = foo ) && barพิสูจน์ให้เห็นว่ามีความสำคัญต่ำกว่าand &&
sargas

ฉันไม่เข้าใจ: "foo and bar" หมายถึงอะไรที่จะกลับมา?
BKSpurgeon

a = foo and bar(a = :foo) and nilเทียบเท่ากับ ตั้งแต่การกำหนดผลตอบแทนมูลค่าที่แท้จริงเหตุผล ( :foo) nilแล้วประเมินส่วนที่สองซึ่งล้มเหลวกลับ
tadman

61

คู่มือสไตล์ทับทิมกล่าวว่าดีกว่าที่ฉันสามารถ:

ใช้ && / || สำหรับนิพจน์บูลีนและ / หรือสำหรับโฟลว์การควบคุม (กฎง่ายๆ: ถ้าคุณต้องใช้วงเล็บนอกคุณกำลังใช้ตัวดำเนินการที่ไม่ถูกต้อง)

# boolean expression
if some_condition && some_other_condition
  do_something
end

# control flow
document.saved? or document.save!

53
จริง ๆ แล้วคำแนะนำในขณะนี้บอกว่าเพื่อหลีกเลี่ยงand/ orสมบูรณ์และพวกเขาอาจมีจุด บ่อยครั้งที่การใช้งานในโฟลว์ควบคุมสามารถเขียนได้ชัดเจนยิ่งขึ้นด้วยif/ unlessโอเปอเรเตอร์ (เช่นdocument.save! unless document.saved?)
Yarin

@akostadinov ในกรณีที่คุณไม่ได้หมุนรอบ: คู่มือ Ruby Style ไม่ได้เขียนโดยผู้สร้าง Ruby Ruby ถูกสร้างขึ้นโดย Yukihiro Matsumoto และคนอื่น ๆ ในขณะที่ Ruby Style Guide เป็นหลักโดย Bozhidar Batsov
Andrew Grimm

2
@ AndrewGrimm ขอบคุณรู้ดี ขออภัยที่หลอกฉันด้วยความจริงใจกับบางแง่มุมของความเป็นจริงทับทิม สิ่งหนึ่งที่แน่นอน - โครงการทับทิมทุกโครงการต้องการนโยบายสไตล์ที่เข้มงวดเพื่อให้สามารถรักษา codebase ได้
akostadinov

37

||และ&&เชื่อมโยงกับลำดับความสำคัญที่คุณคาดหวังจากโอเปอเรเตอร์บูลีนในภาษาการเขียนโปรแกรม ( &&แข็งแรงมากมีความแข็งแกร่ง||น้อยกว่าเล็กน้อย)

andและorมีความสำคัญต่ำกว่า

ยกตัวอย่างเช่นไม่เหมือน||, orมีความสำคัญต่ำกว่า=:

> a = false || true
 => true 
> a
 => true 
> a = false or true
 => true 
> a
 => false

เช่นเดียวกันไม่เหมือน&&กันandมีลำดับความสำคัญต่ำกว่า=:

> a = true && false
 => false 
> a
 => false 
> a = true and false
 => false 
> a
 => true 

มีอะไรมากกว่าที่แตกต่าง&&และ||, andและorผูกกับความสำคัญเท่ากัน

> !puts(1) || !puts(2) && !puts(3)
1
 => true
> !puts(1) or !puts(2) and !puts(3)
1
3
 => true 
> !puts(1) or (!puts(2) and !puts(3))
1
 => true

อ่อนที่มีผลผูกพันandและorอาจจะเป็นประโยชน์เพื่อการควบคุมการไหล: ดูhttp://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/


2
"แตกต่าง||, orมีความสำคัญต่ำกว่า=" ... ตอนนี้มันทำให้รู้สึกมากขึ้นขอบคุณ!
Steph Sharp

18

and&&มีความสำคัญต่ำกว่า

แต่สำหรับผู้ใช้ที่ไม่มีข้อสันนิษฐานปัญหาอาจเกิดขึ้นหากมีการใช้งานพร้อมกับตัวดำเนินการอื่นที่มีลำดับความสำคัญอยู่ระหว่างตัวอย่างเช่นตัวดำเนินการที่ได้รับมอบหมาย:

def happy?() true; end
def know_it?() true; end

todo = happy? && know_it? ? "Clap your hands" : "Do Nothing"

todo
# => "Clap your hands"

todo = happy? and know_it? ? "Clap your hands" : "Do Nothing"

todo
# => true

1
ขอบคุณ แต่ความสำคัญของ "และ" ต่างจาก "&&" เป็นอย่างไร
BKSpurgeon

2
@BKSpurgeon ดูที่นี่เพื่อดูรายการลำดับความสำคัญของโอเปอเรเตอร์ใน Ruby
thutt

5

andมีลำดับความสำคัญต่ำกว่าส่วนใหญ่เราใช้เป็นตัวปรับเปลี่ยนการควบคุมการไหลเช่นif:

next if widget = widgets.pop

กลายเป็น

widget = widgets.pop and next

สำหรับor:

raise "Not ready!" unless ready_to_rock?

กลายเป็น

ready_to_rock? or raise "Not ready!"

ฉันชอบที่จะใช้ifแต่ไม่ได้andเพราะifเป็นที่เข้าใจมากขึ้นดังนั้นฉันก็ไม่สนใจและandor

อ้างถึง " การใช้" และ "และ" หรือ "ในทับทิม " สำหรับข้อมูลเพิ่มเติม


0

ฉันไม่รู้ว่านี่เป็นความตั้งใจของ Ruby หรือหากนี่เป็นข้อผิดพลาด แต่ลองใช้โค้ดด้านล่างนี้ รหัสนี้ทำงานบน Ruby เวอร์ชั่น 2.5.1 และอยู่ในระบบ Linux

puts 1 > -1 and 257 < 256
# => false

puts 1 > -1 && 257 < 256
# => true

1
@JakubArnold Sarcasm ไม่เป็นประโยชน์ ตัวอย่างบางครั้ง
BobRodes

@ BobRodes มันไม่ใช่คำถากถาง มี 7 คำตอบซึ่ง 6 ตัวอย่างมีอยู่แล้ว
Jakub Arnold

1
@JakubArnold ฉันยังพบว่าตัวอย่างนี้มีประโยชน์
BobRodes

ฉันได้รับผลลัพธ์ที่แปลกเช่นกัน v1 = จริงและเท็จ p v1 # => app.rb: จริง, IRB: false v2 = จริง && p p v2 # => app.rb: false, IRB: false ทำให้ 1> -1 && 257 <256 # => app.rb: false, IRB: false
Rich_F
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.