2014-10-02 6 views
-1

Enumerable에 all?이라는 메소드가 있습니다.내 모든 것을 쓰려고합니까? Ruby의 메소드

저는 Enumberable의 라이브러리를 직접 작성하여 배우려고합니다.

이것은 all? 메소드에 대해 지금까지 제가 제시 한 것입니다. 나는 그것을 이해할 수 있지만 초기화 된 값을 메서드에 전달하려고 할 때 난처한 상황에 처하게됩니다. 기록에 대한

편집, 나는 내가 가진 열거 방법은 올바른 방법으로 즉하지 것을 알고 있어요, 그것은 하드 코딩 된 배열입니다. 이것은 자기 학습 목적을위한 것입니다. 난 그냥 초기화 된 값을 전달하는 방법을 알아 내려고 애 쓰고있다 모두? 방법. 그래서 열심히 노력하고 있는지 확인하기 위해 열거 형을 쓴 이유입니다. 이 계급을 문자 그대로의 복음으로 삼지 마십시오. 고맙습니다.

class LearningMethods 

    def initialize(values) 
    @values = values 
    end 

    def enum 
    array = [10, 3, 5] 
    end 


    def all?(a) 
    yield(a) 
    end 

end 

c = LearningMethods.new([10, 3, 5]) 
p c.enum.all? {|x| x >= 3 } #this works 

p c.all?(10) { |x| x >= 3 } #this works 

p c.all?(@values) { |x| x >= 3 } #this doesn't work. Why not? And how do I pass the initialized values? 
+2

*이 방법은 * 작동하지 않습니다. 여기서 여러 가지 일이 잘못 될 수 있습니다. 보여준 코드에서'@ values'는 실패 행에서 사용중인 범위에 정의되어 있지 않습니다. – lurker

+2

코드에 문제가 너무 많습니다. 나는 그들을 지적하는 것이 도움이 될 지 확신하지 못합니다. Enumerable을 다시 구현하기 전에 클래스, 블록 및 출력량의 기본 사용법을 읽어야합니다. – Max

+0

직접 작성하는 대신, 실제로 방법이 쓰여지는 방법을 실제로보고하는 것이 좋습니다. 자유롭게 사용할 수있는 Ruby의 소스 코드를 탐색하거나 http://ruby-doc.org로 이동하여보고 싶은 방법을 "클릭하여 소스 전환"링크를 클릭하면됩니다. 일부는 Ruby에서 구현되고 다른 일부는 C로 구현되지만, 어떤 방식 으로든 그 방식을 볼 수 있습니다. –

답변

0

왜 열거 형을 사용해야하는지 잘 모르겠습니까? Enumerable은 배열에 포함 된 모듈이므로, 익숙하지 않다면 Ruby에서 "modules and mix-ins"에 대해 읽어 보시기 바랍니다.

all?은 각 배열 요소를 블록에 전달하기 만하면됩니다. 블록이 false를 반환하는 요소가 1 개 이상있는 경우 all?은 false로 평가됩니다. 이 코드를 분석해보십시오.

class MyAllImplementation 
    def initialize(array) 
    @array = array 
    end 

    def my_all? 
    @array.each do |element| # for each element of the array 
     return true unless block_given? # this makes sure our program doesn't crash if we don't give my_all? a block. 
     true_false = yield(element) # pass that element to the block 
     return false unless true_false # if for ANY element the block evaluates to false, return false 
    end 
    return true # Hooray! The loop which went over each element of our array ended, and none evaluted to false, that means all elements must have been true for the block. 
    end 
end 


a = MyAllImplementation.new([1,2,3]) 
p a.my_all? { |x| x > 0 } #=> true 
p a.my_all? { |x| x > 1 } # false, because 1 is not bigger than 1, it's equal to 1 
+0

'all?'을 다시 구현하려면 블록 없이도 작동해야합니다 (코드는'LocalJumpError'를 제공합니다). – Max

+0

모두 사용 해 본 적이 없습니까? 어떤 이유로 블록을 사용하지 않고 동작을 알지 못했지만 코드에이 경우를 추가했습니다. – daremkd

+0

@daremkd, 각 반복자없이이 작업을 수행 할 수있는 방법이 있습니까? 나는'Array'와'Enumerable' 라이브러리의 메소드를 사용하지 않기 위해 노력하고 있습니다. – user273072545345

관련 문제