it-swarm.com.de

Gibt es ein Gegenteil von Include? für Ruby Arrays?

Ich habe die folgende Logik in meinem Code:

if [email protected]?(p.name)
  ...
end

@players ist ein Array. Gibt es eine Methode, um den ! zu vermeiden?

Im Idealfall wäre dieser Ausschnitt:

if @players.does_not_include?(p.name)
  ...
end
150
Tyler DeWitt
if @players.exclude?(p.name)
    ...
end

ActiveSupport fügt die exclude? - Methode zu Array, Hash und String hinzu. Dies ist kein reiner Rubin, sondern wird von vielen Rubyisten verwendet.

Quelle: Active Support Core-Erweiterungen (Rails Guides)

302
dizzy42

Bitte schön:

unless @players.include?(p.name)
  ...
end

Unter Ruby Style Guide finden Sie weitere Informationen zu ähnlichen Techniken.

81
Bozhidar Batsov

Wie wäre es mit dem folgenden:

unless @players.include?(p.name)
  ....
end
10
ilasno
module Enumerable
  def does_not_include?(item)
    !include?(item)
  end
end

Ok, aber im Ernst, das funktioniert gut.

6
Jesse Wolgamott

Nur bei Ruby

TL; DR

Verwenden Sie none? und übergeben Sie einen Block mit == für den Vergleich:

[1, 2].include?(1)
  #=> true
[1, 2].none? { |n| 1 == n  }
  #=> false

Array # include?

Array#include? akzeptiert ein Argument und verwendet ==, um jedes Element im Array zu überprüfen:

player = [1, 2, 3]
player.include?(1)
 #=> true

Aufzählbare # keine?

Enumerable#none? kann auch ein Argument akzeptieren. In diesem Fall verwendet es === für den Vergleich. Um das gegenteilige Verhalten auf include? zu bekommen, lassen wir den Parameter weg und übergeben ihm einen Block mit == für den Vergleich.

player.none? { |n| 7 == n }
 #=> true 
!player.include?(7)    #notice the '!'
 #=> true

Was zu beachten ist

Im obigen Beispiel können wir tatsächlich verwenden:

player.none?(7)
 #=> true

Das liegt daran, dass Integer#== und Integer#=== gleichwertig sind. Aber bedenken Sie:

player.include?(Integer)
 #=> false
player.none?(Integer)
 #=> false

none? gibt false zurück, weil Integer === 1 #=> true. Aber wirklich eine legitime notinclude?-Methode sollte true zurückgeben. So wie zuvor:

player.none? { |e| Integer == e  }
 #=> true
5
Sagar Pandya

Verwenden Sie es sei denn.

unless @players.include?(p.name) do
  ...
end
2

Kannst du --- benutzen

unless @players.include?(p.name) do
...
end

es sei denn, das Gegenteil ist das Wenn.

oder Sie können reject .__ verwenden. Sie können die nicht benötigten Elemente ablehnen

@players.reject{|x| x==p.name}

nachdem Sie die Ergebnisse erhalten haben, können Sie Ihre Implementierung durchführen

1
tekuri

Ich schaute für mich selbst auf, fand das und dann eine Lösung. Menschen verwenden verwirrende Methoden und einige Methoden, die in bestimmten Situationen nicht oder überhaupt nicht funktionieren.

Ich weiß, es ist jetzt zu spät, wenn man bedenkt, dass dies vor 6 Jahren veröffentlicht wurde, aber hoffentlich finden zukünftige Besucher dies (und hoffentlich können sie ihren und Ihren Code bereinigen.)

Einfache Lösung:

if not @players.include?(p.name) do
  ....
end
0
Voidableryzer

Probieren Sie es aus, es ist reiner Ruby, so dass Sie keine Peripherie-Frameworks hinzufügen müssen

if @players.include?(p.name) == false do 
  ...
end

Ich hatte ein paar Tage lang mit einer ähnlichen Logik zu kämpfen, und nachdem ich einige Foren und Q & A-Boards mit wenig Erfolg überprüft hatte, stellte sich heraus, dass die Lösung ziemlich einfach war. 

0
KarmaDeli

Versuchen Sie etwas so: 

@players.include?(p.name) ? false : true
0
ckshei

Die Verwendung von unless eignet sich gut für Anweisungen mit einzelnen include?-Klauseln. Wenn Sie zum Beispiel die Aufnahme von etwas in einer Array, aber nicht in einer anderen, überprüfen müssen, ist die Verwendung von include? mit exclude? viel freundlicher.

if @players.include? && @spectators.exclude? do
  ....
end

Wie oben von dizzy42 erwähnt, ist für die Verwendung von exclude? ActiveSupport erforderlich

0
MeWillWork4Food