include의 반대가 있습니까? 루비 배열의 경우?


190

내 코드에는 다음과 같은 논리가 있습니다.

if !@players.include?(p.name)
  ...
end

@players배열입니다. 피할 수있는 방법이 !있습니까?

이상적으로이 스 니펫은 다음과 같습니다.

if @players.does_not_include?(p.name)
  ...
end

1
는 IS do유효 루비는? 오류가 발생합니다 syntax error, unexpected end-of-input(을 제거하면 작동합니다 do)
maxymoo

어레이와 세트를 검색하기위한 벤치 마크는 stackoverflow.com/a/60404934/128421 을 참조하십시오 .
Tin Man

답변:


370
if @players.exclude?(p.name)
    ...
end

ActiveSupport은 추가 exclude?방법 Array, Hash등을 String. 이것은 순수한 루비가 아니지만 많은 루비리스트가 사용합니다.

출처 : 액티브 지원 코어 확장 (레일 가이드)



3
사소한 설명 : AS는 Enumerable에 추가하므로 Enumerable을 포함한 모든 클래스와 함께 사용할 수 있습니다. 해시로도. :)
user2422869

1
이것은 녹색으로 표시되어야합니다
etlds

이 방법은 더 이상 Rails 4.2.3 (및 이전 버전)에 자동로드되지 않습니다.require 'active_support/core_ext/enumerable'
Dennis

96

여기 있습니다 :

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

비슷한 기술에 대한 자세한 내용 은 Ruby 스타일 가이드 를 참조하십시오.


스타일 가이드에 대한 찬성 내가 필요한 독서 자료 만.
justnorris

1
하나의 문장으로 읽을 수 있습니다. 많은 사람들이 부정을 더 잘 사용한다면! 또는 루비 배열 클래스에 자신의 메소드를 추가하십시오.
Renars Sirotins

3
제외를 선호합니까? 순수한 루비이기 때문에 대답하십시오.
dscher

1
그러나 복합 조건으로 작업 할 때 여전히 이상합니다. if flag unless @players.include?(p.name)어색하고 if flag && !@players.include?(p.name)부정을 사용합니다.
gabe

1
하지만 if하자 만 true조건을 통과, unless통과 할 수 falsenil. 이것은 때때로 버그를 찾기 어렵게 만듭니다. 그러므로 저는 선호합니다exclude?
ToTenMilan

12

다음은 어떻습니까 :

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

이 사이트에서 답변이 오는 속도에 따라, 나는 좋은 ole nepotism없이 어떤 평판을 얻을지 모르겠습니다! :-D 스타일 가이드 링크는 멋진 터치입니다.
ilasno

2
빠른 것이 아닙니다. 철저한 것입니다. = 발견
Charles Caldwell

11

루비 만보고 :

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. 그러나 실제로 합법적 인 notinclude?방법은 반환해야합니다 true. 우리가 전에했던 것처럼 :

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

7
module Enumerable
  def does_not_include?(item)
    !include?(item)
  end
end

알았지 만 진지하게 그렇지 않으면 제대로 작동합니다.


1
+1 unless스 니펫이 보여도 괜찮지 만 조건이 더 복잡 할 수 있습니다. 나는 이러한 부정 된 메소드를 갖는 것이 편리하다고 생각합니다. 더 선언적인 코드를 허용합니다.
tokland


1

사용할 수 있습니까 :

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

unless이 (가) 반대 if이거나 사용할 수 있습니다 reject.

할 수 있습니다 reject하지 않은 필수 요소 :

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

결과를 얻은 후에 구현을 수행 할 수 있습니다.


0

unless단일 include?절이있는 명령문에는 사용하는 것이 좋지만, 예를 들어, 어떤 것이 포함되어 있는지 Array다른 것을 포함 하지 않는지 확인해야하는 경우 include?with를 사용 하는 exclude?것이 훨씬 더 친숙합니다.

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

그러나 dizzy42가 위에서 말했듯이 사용 exclude?하려면 ActiveSupport 가 필요합니다


Active Support의 Core Extensions 만 있으면됩니다. guides.rubyonrails.org/v3.2/...
틴 남자

0

다음과 같이 해보십시오 :

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

0

이것을 시도하십시오. 순수한 Ruby이므로 주변 프레임 워크를 추가 할 필요가 없습니다.

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

나는 며칠 동안 비슷한 논리로 고심하고 있었고, 여러 포럼과 Q & A 보드를 거의 사용하지 않으면 솔루션이 실제로 매우 간단하다는 것을 알았습니다.


0

나는 이것을 스스로 찾고 있었고, 이것을 찾은 다음 해결책을 찾았습니다. 사람들은 혼란스러운 방법과 특정 상황에서 작동하지 않거나 전혀 작동하지 않는 방법을 사용하고 있습니다.

나는 이것이 6 년 전에 게시되었다는 것을 고려할 때 지금 너무 늦었다는 것을 알고 있지만 희망적으로 미래 방문자가 이것을 발견 할 것입니다 (그리고 희망적으로 코드를 정리할 수 있기를 바랍니다).

간단한 해결책 :

if not @players.include?(p.name) do
  ....
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.