私のコードには次のロジックがあります:
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
。これは純粋なRubyではありませんが、多くのルビイストが使用しています。
require 'active_support/core_ext/enumerable'
if flag unless @players.include?(p.name)
ぎこちなく、if flag && !@players.include?(p.name)
否定を使用します。
if
LETが唯一のtrue
条件に合格し、unless
合格することができますfalse
とnil
。これにより、バグの発見が困難になることがあります。したがって、私は好むexclude?
次はどうですか:
unless @players.include?(p.name)
....
end
Rubyのみを見る:
TL; DR
使用none?
してそれをブロックを渡す==
比較のために:
[1, 2].include?(1)
#=> true
[1, 2].none? { |n| 1 == n }
#=> false
Array#include?
1つの引数を受け入れ==
、配列内の各要素に対してチェックするために使用します。
player = [1, 2, 3]
player.include?(1)
#=> true
Enumerable#none?
また===
、比較に使用する1つの引数を受け入れることもできます。反対の動作を得るには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
。しかし、実際には正当なnotinclude?
メソッドが返すべきtrue
です。前と同じように:
player.none? { |e| Integer == e }
#=> true
module Enumerable
def does_not_include?(item)
!include?(item)
end
end
わかりましたが、真剣に、はうまくいきません。
unless
スニペットが表示されていても問題ありませんが、条件はより複雑になる可能性があります。これらの否定されたメソッドがあると便利だと思います。それらはより宣言的なコードを許可します。
unless
単一のinclude?
句を含むステートメントの使用は問題ありませんが、たとえば、あるものに含まれてArray
いて別のものには含まれていないことを確認する必要がある場合、include?
with の使用exclude?
は非常にわかりやすくなっています。
if @players.include? && @spectators.exclude? do
....
end
しかしdizzy42が上で述べたように、の使用にexclude?
はActiveSupport が必要です
私はこれを自分で探していて、これを見つけて、解決策を見つけました。人々は混乱を招く方法と、特定の状況でまったく機能しないかまったく機能しないいくつかの方法を使用しています。
これが6年前に投稿されたことを考えると、今では手遅れであることがわかっていますが、うまくいけば、将来の訪問者がこれを見つけます(そしてうまくいけば、コードをクリーンアップできます)。
シンプルなソリューション:
if not @players.include?(p.name) do
....
end
do
有効なルビーは?エラーが発生しますsyntax error, unexpected end-of-input
(削除すると機能しますdo
)