ฉันมีตรรกะดังต่อไปนี้ในรหัสของฉัน:
if !@players.include?(p.name)
...
end
@players
เป็นอาร์เรย์ มีวิธีการ!
หรือไม่ดังนั้นฉันจึงสามารถหลีกเลี่ยง
โดยหลักแล้วตัวอย่างนี้จะเป็น:
if @players.does_not_include?(p.name)
...
end
ฉันมีตรรกะดังต่อไปนี้ในรหัสของฉัน:
if !@players.include?(p.name)
...
end
@players
เป็นอาร์เรย์ มีวิธีการ!
หรือไม่ดังนั้นฉันจึงสามารถหลีกเลี่ยง
โดยหลักแล้วตัวอย่างนี้จะเป็น:
if @players.does_not_include?(p.name)
...
end
คำตอบ:
if @players.exclude?(p.name)
...
end
ActiveSupport เพิ่มexclude?
วิธีการในการArray
, และHash
String
นี่ไม่ใช่ทับทิมบริสุทธิ์ แต่ถูกใช้โดยนักทับทิมจำนวนมาก
require 'active_support/core_ext/enumerable'
ไปเลย:
unless @players.include?(p.name)
...
end
คุณอาจดูคู่มือทับทิมสไตล์สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเทคนิคที่คล้ายกัน
if flag unless @players.include?(p.name)
อึดอัดใจและif flag && !@players.include?(p.name)
ใช้การปฏิเสธ
if
ปล่อยให้เพียงtrue
ผ่านสภาพunless
ช่วยให้ผ่านและfalse
nil
บางครั้งสิ่งนี้นำไปสู่การหาข้อบกพร่องยาก ดังนั้นฉันชอบexclude?
วิธีการเกี่ยวกับต่อไปนี้:
unless @players.include?(p.name)
....
end
ดูทับทิมเท่านั้น:
TL; DR
ใช้none?
ส่งต่อบล็อกด้วย==
สำหรับการเปรียบเทียบ:
[1, 2].include?(1)
#=> true
[1, 2].none? { |n| 1 == n }
#=> false
Array#include?
ยอมรับหนึ่งอาร์กิวเมนต์และใช้==
เพื่อตรวจสอบกับแต่ละองค์ประกอบในอาร์เรย์:
player = [1, 2, 3]
player.include?(1)
#=> true
Enumerable#none?
ยังสามารถยอมรับหนึ่งอาร์กิวเมนต์ในกรณีที่มันใช้===
สำหรับการเปรียบเทียบ เพื่อให้ได้พฤติกรรมที่ตรงข้ามกับinclude?
เราเราจะละเว้นพารามิเตอร์และส่งมันเป็นบล็อกที่ใช้==
สำหรับการเปรียบเทียบ
player.none? { |n| 7 == n }
#=> true
!player.include?(7) #notice the '!'
#=> true
ในตัวอย่างข้างต้นเราสามารถใช้จริง:
player.none?(7)
#=> true
นั่นเป็นเพราะInteger#==
และInteger#===
เทียบเท่า แต่พิจารณา:
player.include?(Integer)
#=> false
player.none?(Integer)
#=> false
none?
ผลตอบแทนเพราะfalse
Integer === 1 #=> true
แต่จริงๆ Legit วิธีควรกลับnotinclude?
true
อย่างที่เราเคยทำมาก่อน:
player.none? { |e| Integer == e }
#=> true
module Enumerable
def does_not_include?(item)
!include?(item)
end
end
ตกลง แต่อย่างจริงจังเว้นแต่จะได้ผลดี
unless
ไม่เป็นไรสำหรับตัวอย่างที่แสดง แต่สภาพอาจซับซ้อนกว่านี้ ฉันคิดว่ามันมีประโยชน์ที่จะมีวิธีที่ทำให้ไร้ผลเหล่านี้พวกเขาอนุญาตให้มีรหัสที่เปิดเผยมากขึ้น
การใช้unless
:
unless @players.include?(p.name) do
...
end
คุณสามารถใช้:
unless @players.include?(p.name) do
...
end
unless
เป็นสิ่งที่ตรงกันข้ามหรือคุณอาจจะใช้if
reject
คุณสามารถreject
องค์ประกอบที่ไม่จำเป็น:
@players.reject{|x| x==p.name}
หลังจากได้รับผลลัพธ์คุณสามารถใช้งานได้
การใช้unless
คำสั่งที่ดีสำหรับประโยคที่มีinclude?
คำสั่งเดียวแต่ตัวอย่างเช่นเมื่อคุณต้องการตรวจสอบการรวมบางอย่างในที่เดียวArray
แต่ไม่ได้อยู่ในที่อื่นการใช้include?
ด้วยexclude?
นั้นง่ายกว่ามาก
if @players.include? && @spectators.exclude? do
....
end
แต่ดังที่ dizzy42 กล่าวไว้ข้างต้นการใช้งานexclude?
จำเป็นต้องมี ActiveSupport
ลองสิ่งนี้:
@players.include?(p.name) ? false : true
ลองสิ่งนี้มันเป็น Ruby บริสุทธิ์ดังนั้นไม่จำเป็นต้องเพิ่มเฟรมเวิร์กอุปกรณ์ต่อพ่วงใด ๆ
if @players.include?(p.name) == false do
...
end
ฉันกำลังดิ้นรนกับตรรกะที่คล้ายกันสองสามวันและหลังจากตรวจสอบฟอรัมหลายแห่งและบอร์ดถาม - ตอบเพื่อประโยชน์เล็กน้อยมันกลับกลายเป็นว่าวิธีแก้ปัญหานั้นง่ายมาก
ฉันค้นหาสิ่งนี้ด้วยตัวเองค้นพบสิ่งนี้จากนั้นก็หาทางแก้ไข ผู้คนใช้วิธีการที่สับสนและวิธีการบางอย่างที่ไม่สามารถใช้งานได้ในบางสถานการณ์หรือไม่ได้เลย
ฉันรู้ว่ามันสายเกินไปแล้วเมื่อพิจารณาว่าเรื่องนี้โพสต์เมื่อ 6 ปีที่แล้ว แต่หวังว่าผู้เยี่ยมชมในอนาคตจะพบสิ่งนี้ (และหวังว่ามันจะสามารถทำความสะอาดโค้ดของคุณและของคุณได้)
วิธีแก้ปัญหาง่าย ๆ :
if not @players.include?(p.name) do
....
end
do
ทับทิมถูกต้อง? ฉันได้รับข้อผิดพลาดsyntax error, unexpected end-of-input
(ทำงานถ้าฉันลบdo
)