변수가 범위 내에 있는지 확인?


134

다음과 같은 루프를 작성해야합니다.

if i (1..10)
  do thing 1
elsif i (11..20)
  do thing 2
elsif i (21..30)
  do thing 3
etc...

그러나 지금까지 구문 측면에서 잘못된 길을 갔다.

답변:


306
만약 사이에 있다면? (1, 10)
  일을 1 
elsif i.between? (11,20)
  일을 2 
...

3
이것은 또한 작동 Date하고 DateTime있는 동안 개체를 ===하지 않습니다.
Aditya

i.between?(1..10)작동하지 않습니다 (있는 경우 ..) 그 이유가 있어야한다고 생각합니다.
비극성

중에서? 범위를 허용하지 않는 두 개의 매개 변수가 필요합니다.
Manish Nagdewani

5
포함 또는 독점입니까?
andrewcockerham

1
@andrewcockerham 포함. 3.between?(1, 3) => true
Tyler James Young

84

===연산자 (또는 그 동의어 include?)를 사용하십시오.

if (1..10) === i

1
또한 작업의 좋은 장점이 있습니다 i(같은 수보다 뭔가 다른 인 nil)
크리스토퍼 클랑

4
범위가 상당히 큰 경우 매우 효율적인 솔루션처럼 보이지 않습니다.
rthbound

6
장래의 독자에게는 대안 if i === (1..10)이 작동하지 않습니다
Anwar

@rthbound, 왜? (1..10000000000000000) 배열이 아닙니다. (1..10000000000000000) === 5000000000000000단지 후드 테스트 "사이의"를하고있다
존 라 Rooy

1
@Anwar는 왜 다른 방식으로 작동하지 않는지 설명 할 수 있습니까?
Govind Rai 1

70

@Baldu가 말했듯이 === 연산자를 사용하거나 내부적으로 ===를 사용하는 유스 케이스 / 사용 :

case i
when 1..10
  # do thing 1
when 11..20
  # do thing 2
when 21..30
  # do thing 3
etc...

모든 답변 중 여러 범위가있는 경우 가장 성능이 우수합니다.
xentek

40

여전히 범위를 사용하려면 ...

def foo(x)
 if (1..10).include?(x)
   puts "1 to 10"
 elsif (11..20).include?(x)
   puts "11 to 20"
 end
end

8

일반적으로 다음과 같은 기능으로 훨씬 더 나은 성능을 얻을 수 있습니다.

if i >= 21
  # do thing 3
elsif i >= 11
  # do thing 2
elsif i >= 1
  # do thing 1



1

Ruby에서 빌드 할 수있는보다 역동적 인 답변 :

def select_f_from(collection, point) 
  collection.each do |cutoff, f|
    if point <= cutoff
      return f
    end
  end
  return nil
end

def foo(x)
  collection = [ [ 0, nil ],
                 [ 10, lambda { puts "doing thing 1"} ],
                 [ 20, lambda { puts "doing thing 2"} ],
                 [ 30, lambda { puts "doing thing 3"} ],
                 [ 40, nil ] ]

  f = select_f_from(collection, x)
  f.call if f
end

따라서이 경우 "범위"는 경계 조건을 포착하기 위해 실제로는 0으로 묶여 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.