2013-09-10 2 views
0

로 설계 객체에서 최종 결과를 반환하는 방법 :나는이 운동을하고있는 중이 야 체인 방법

  • 이 운동을하려면, 당신은 아마 return self을 사용해야합니다. 메서드가 자체적으로 반환되면 메서드를 연결할 수 있습니다.
  • 다음 함수가있는 MathDojo이라는 루비 클래스를 개발하십시오 : 더하기, 빼기. 이 두 가지 함수가 적어도 하나의 매개 변수를가집니다. MathDojo.new.add(2).add(2, 5).subtract(3, 2)0+2+(2+5)-(3+2)을 수행하고 4을 반환해야합니다. 내 코드 반환, 지금

    class MathDojo 
        def initialize 
        @sum = 0 
        end 
        def add(*numbers) 
        numbers.inject(@sum) { |sum, number| sum + number } 
        self 
        end 
        def subtract(*numbers) 
        numbers.inject(@sum) { |sum, number| sum - number } 
        self 
        end 
    end 
    

    :

이 코드가

MathDojo.new.add(2).add(2, 5).subtract(3, 2) 
# => #<MathDojo:0x0000000160b0c0> 

어떻게 객체 대신 개체 자체의 인스턴스 변수를 반환합니까? 나는 self에 반환을 제거하면, 방법은 더 이상 체인, 나는 하나의 메소드를 호출 할 수 있어요하지만 다음 체인이 예상대로 작동 있도록

MathDojo.new.subtract(2,3) 
# => -5 

가 어떻게 내 코드를 수정합니까를?


내 의견에 대한 하향 투표는 나 자신의 질문에 답하는 데 필요한 평판 아래 놓았 기 때문에 편집해야했습니다. 내 사과.

숫자를 배열에 삽입하기 전에 배열을 평평하게해야했습니다. 그런 다음 attr_accessor를 추가하여 클래스 외부에서 사용하기 위해 합계를 수집합니다.

return self 

나는 다음을 입력하여 코드를 수정 JBH의 대답 같이 : 나는 또한 읽고 자기의 묵시적 수익을 변경 내가 추가 수정 및 포함하는 방법을 빼기 다음

attr_accessor :sum 
before my initialize method 

평평하게 부르심 :

JBH 또한 내 체인 방법에 .sum 추가 가리 켰을 때, 다음
@sum = numbers.flatten.inject(@sum) { |sum, number| sum + number } 
@sum = numbers.flatten.inject(@sum) { |sum, number| sum - number } 

:

puts math1 = MathDojo.new.add(2).add(2, 5).subtract(3, 2).sum 

한 가지 더, 사람들은 curmudgeony가 stackoverflow에있는 문제 해결 자 - 사람이 될 수있는 방법에 대해 이야기하고 오늘 저는 그것을 경험했습니다. 분명히 루비에 대해 처음 알았습니다. (제 2 일 밖에 걸리지 않았 음을 명심해야했습니다.) 제 질문에 대한 형식이 맘에 들지 않았기 때문에 2 점을 뽑아 내 평판을 가져야했습니다. 편집하다.

답변

3

메서드가 호출 될 때 그 뒤에 체인 호출이있을 경우이를 알 수 없습니다. 따라서 자기 또는 합계 값을 반환해야하는지 여부를 선택할 수 없습니다. 그것에 대해

간단한 대답은, 문제가 해결되지 않은 연쇄 호출

class MathDojo 
    attr_reader :sum 
end 

puts MathDojo.new.add(2).add(2, 5).subtract(3, 2).sum 
+0

이의 끝에서 호출해야 합 방법을 만들 수 있습니다. 나는 합계가 주입 된 배열을 평평하게 할 필요가있었습니다. – user1821396

+0

의도적으로 체인 연결에 대한 질문에 답변합니다.당신이 격렬한 행사를하고있을 때, 나는 당신을 망치고 싶지 않을 것입니다. – jbh