3

배열을 다른 배열이나 해시로 푸는 방법을 찾으려면 몇 시간을 보냈습니다. 이 질문의 형식이 조금 지저분하면 사전에 사과하십시오. 내가 StackOverflow에 대한 질문을 한 것은 이번이 처음이므로 내 질문의 스타일을 올바르게 잡으려고합니다.Ruby를 사용하여 배열을 다른 배열로 푸시하고 대괄호를 반환하십시오.

class TestNAME < Test::Unit::TestCase 
    def test_directions() 
     assert_equal(Lexicon.scan("north"), [['direction', 'north']]) 
     result = Lexicon.scan("north south east") 

     assert_equal(result, [['direction', 'north'], 
     ['direction', 'south'], 
     ['direction', 'east']]) 

    end 
end 

내가 함께 왔어요 가장 간단한 것은 다음과 같습니다 :

나는 다음과 같은 시험 장치의 과거를 만들기 위해 코드를 작성해야합니다. 첫 번째 부분은 통과하지만 rake test을 실행하면 두 번째 부분이 예상 결과를 반환하지 않습니다.

대신 또는 반환 :

[[ "방향", "북쪽"], [ "방향", "남쪽"], [ "방향", "동쪽"]]

이 반환 것 :

[ "북쪽", "남", "동쪽"]

y의 결과를 콘솔에 문자열로 출력해도 다른 어레이에 포함되지 않은 별도의 어레이가 3 개 있습니다 (아래 참조). 배열의 가장 바깥 쪽 대괄호를 인쇄하지 않은 이유는 무엇입니까? y? 이에 대한 모든 의견이 많이 이해할 수있을 것이다

class Lexicon 

def initialize(stuff) 
     @words = stuff.split 
    end 

    def self.scan(word) 
    if word.include?(' ') 
     broken_words = word.split 

     broken_words.each do |word| 
     x = ['direction'] 
     x.push(word) 
     y = [] 
     y.push(x)    
     end 
    else 
     return [['direction', word]] 
    end 

    end 

end 

: 아래

["direction", "north"] ["direction", "south"] ["direction", "east"]

내가 위의 테스트 유닛을 통과하기위한 시도로 작성한 코드입니다. 미리 감사드립니다.

답변

2

당신이보고있는 것은 each의 결과입니다.이 결과는 반복되는 것 또는이 경우에는 broken_words을 반환합니다. 원하는 것은 collect이며 변환 된 값을 리턴합니다. 원래의 y은 사용 된 적이 없으며, 작성된 후에는 폐기됩니다. 임의의 자리의 수보다는 하나에

  • 분할 : 그것은 몇 가지가 여기에 변경된 주목할 필요가

    class Lexicon 
        def initialize(stuff) 
        @words = stuff.split 
        end 
    
        def self.scan(word) 
        broken_words = word.split(/\s+/) 
    
        broken_words.collect do |word| 
         [ 'direction', word ] 
        end 
        end 
    end 
    

    :

    은 여기까지 고정 된 버전입니다.

  • 2 개 대신 단일 사례로 단순화.
  • 중복 return 문을 제거합니다.

{ direction: word }과 같은 데이터 구조를 사용하는 것이 좋습니다. 따라서 entry[:direction]을 사용하면 모호한 값인 entry[1]을 피하기 때문에 참조하는 값을 훨씬 쉽게 만들 수 있습니다.

+0

정말 고마워요! 나는 '수집'에 대해 몰랐다. 매우 유용한 방법! –

+0

['Enumerable'] (http://ruby-doc.org/core-2.1.4/Enumerable.html) 모듈은 이와 같은 유용한 메소드로 가득차 있기 때문에 Ruby를 배우는 데 시간을 할애해야합니다. 그. 일부는 매우 편리합니다. – tadman

0

Lexicon 객체를 인스턴스화하지 않는 경우 모듈을 사용하면 객체를 인스턴스화하지 않는다는 것을 명확하게 알 수 있습니다.

또한,이 여분의 변수 (즉 broken_words)를 사용할 필요가없고, I는 기능 블록 대 반복 블록에 대한 do..end 구 위에 {} 블록 구문을 선호한다.

module Lexicon 
    def self.scan str 
    str.split.map {|word| [ 'direction', word ] } 
    end 
end 

UPDATE : 캐리의 의견에 따라 내가 분할 불필요한 인수를 제거했습니다 (나는 그가 스캔 말했을 때 그가 분할을 의미 가정).

+0

'scan'과'scan (/ \ s + /)'는 똑같습니다 ('$;'로 엉망이 없다고 가정). –

+0

또한 '['direction ']. product (str.split)'가 아니라면 제한된 타이핑에 관심이있는 것 같아서 13자를 절약 할 수 있습니다. :) (공백을 무시하면 7 점) – engineersmnky