2012-02-03 8 views
3

루비 프로그래밍 할 때 나는 항상 나 자신이 일을 찾을 :루비 분 최대 대입 연산자

a = [a, b].min 

ab을 비교하고 a에서 가장 작은 값을 저장하는 것을 의미한다. 위에 코드를 작성하는 것이 싫으므로 a을 두 번 써야합니다.

나는 C++의 일부 표준이 아닌 방언 정확히 내가 매우 편리 발견이

a <?= b 

했다 작업자을 한 것으로 알고있다. 그러나 나는 반복자 피하기의 특징에있는만큼 운영자에게 정말로 관심이 없다.. 내가

a.keep_max(b) 

amy_array[indice1][indice2]처럼 매우 긴 변수가 될 수 있습니다 쓸 수 있다면 나 또한 행복 할 것입니다, 당신은 두 배를 쓰고 싶지 않습니다.

나는 이것에 인터넷 검색을 많이 했으므로 아무런 결과도 발견되지 않았으므로이 질문은 다른 사람들에게도 유용 할 것입니다.

그래서 루비에서 내가 원하는 것을 표현할 수있는 비 반복적 인 방법이 있습니까?

class Object 
    def keep_max(other) 
    [self, other].max 
    end 
end 

a = 3 
b = 7 
puts a.keep_max(b) 

을하지만 (개체를 비교할 수없는 경우, 예를 들면) 당신은 예기치 않은 동작을 수있는 오브젝트에주의 정의 방법이어야한다 :

+1

IMO 다시 바인딩 값 (좋은 이유없이) 나쁜 선택입니다, 그냥 다른 이름으로 새 변수를 만듭니다. 그것에 대해 생각해보십시오 : 이제'a'는 값 2를 가지며, 어떤 마술은'a'가 값 1을가집니다 ... 그 종류의 코드는 이해하고 디버그하기가 더 어렵습니다. 하지만, 물론, 나는 기능적으로 위독하다 ;-) – tokland

+0

@tokland, 아마도.그러나 일반적인 동적 프로그래밍 코드 인 floyd-warshall을 사용하면 표현한대로 정확하게 수행 할 수 있습니다. 모든 과제는 명령형 언어의 힘이 될 수 있습니다. – Tarrasch

+1

당신이 명령형 루프 안에있을 때, 변수 이름을 재사용 할 수는 없지만 (그 알고리즘의 기능적 구현은 Ruby에서 비효율적 일 수 있습니다). 내 메모는 단지 변수 이름을 다시 사용하는 지연 코딩에 대한 예방 조치였습니다. – tokland

답변

2

실제로 루비에서는 (see this question) 할 수 없다. 나는 당신이 할 수있는 최선은

def max(*args) 
    args.max 
end 

a = max a, b 
+0

정답은 'eval'트릭 없이는 불가능하다는 것입니다 (또 다른 질문 인 thanks @ kentor). – Tarrasch

+0

그러면 왜'a + = 1'이 작동합니까? – Chloe

1

당신은 그것을 위해 자신의 방법을 정의 할 수 있습니다.

2

질문이 이해가 가지 않습니다. 당신은 항상 ... < => 모두가 Comparable를 구현하고있는 때문이 아니라, 당신이 수 있도록 원숭이 패치 개체 모든 개체에 대해 작동하지 않습니다

module Comparable 
    def keep_min(other) 
    (self <=> other) <= 0 ? self : other 
    end 

    def keep_max(other) 
    (self <=> other) >= 0 ? self : other 
    end 
end 

1.keep_min(2) 
=> 1 

1.keep_max(2) 
=> 2 

글쎄, 이런 식으로 뭔가를 할 수 있습니다.

개인적으로 나는 명확성을 선호하며 원숭이 패치를 피하는 경향이 있습니다. 또한,이 명확하게 단지처럼 이항 조건이다 "+"따라서 메소드 체인은 반드시 해당 배열 구문 없애 ​​그래서 나는 이런 식으로 뭔가를 선호 이해가되지 않습니다 :

def min(*args) 
    args.min 
end 

def max(*args) 
    args.max 
end 

min(1, 2) 
=> 1 

max(1, 2) 
=> 2 

하지만, 이봐 , 나는 또한 파이썬 개발자이다 :-)

0
def keep_max(var, other, binding) 
    eval "#{var} = [#{var}, #{other}].max", binding 
end 

a = 5 
b = 78 
keep_max(:a, :b, binding) 
puts a 
#=> 78 

이 기본적으로 당신이 원하는 것을 생각합니다. 좀 봐봐 Change variable passed in a method

+0

'eval'과'keep_max'를위한'binding'은 그렇게하지 않는 것이 좋습니다 – Dorian

-1
arr = {2,4,3,6} 
    min = arr[0]; 
    max = arr[0]; 
    arr1[0]=arr[1]; 
    arr1[1]=arr[2]; 
    arr1[2]=arr[3]; 
    arr1.each() { |val| 
     if min>val 
     min=val; 
    end 
    } 
    arr1.each() { |val| 
     if max<val 
     max=val 
    end 
    } 
    puts "The minimum value is #{min}" 
    puts "The maximum value is #{max}" 
+0

안녕하세요 : 스택 오버플로에 오신 것을 환영합니다! 간단히 알려 드리겠습니다. 일반적으로 답변에 코드를 게시하는 것이 좋습니다. 당신이 당신의 대답이 가지고있는 것에 약간의 맥락을 추가하기 위해 편집 할 수 있다면, 그것은 크게 감사 할 것입니다 :). Thx ^^ – Patrice