2013-09-06 5 views
1

나는 방법은 내가 배열에 해당 문자열을 변환 할 필요가 제대로 작동하려면 배열 또는 문자열루비 문자열 변수? (배열)

을 얻을 것 중 하나 방법이있다. 때때로 문자열을 얻을 것이므로 변수가 배열인지 검사하고 배열로 변환하지 않았 으면합니다. 그래서 나는 다음과 같이했다 :

unless variablename.is_a?(Array) 
    variablename = variablename.lines.to_a 
end 

이 두 번째 라인은 실패하고 나는 '라인'을 배열 객체에 사용할 수 없다는 루비 오류가 발생한다.

나는 또한 .kind_of를 시도 했습니까? 같은 결과가 있습니다

나는 내 대답을 얻었지만, 정확히 내가 무엇을 묻고 있는지 명확히하고 싶었습니다. variablename이 배열인지 테스트하려고합니다. 여기서 variableName가 배열 이유로, 여전히 실행 번째 행보다 다음 오류 실패 #Array위한 정의 방법 '라인'0x000000021382b8 (NoMethodError)

+5

당신은 그것의 내용과 형식을 보장하기 위해'variablename'를 검사 할 수 있습니다, 던져진 실제 예외를 제공합니까? –

+0

'variablename'과 (과) 비슷한 문자열이 아닙니다. 그러나'string' 대신에'string.lines'를 여러분의 메소드에 넘겨주고 검사를 피하십시오. – Stefan

+0

왜 확인 하시겠습니까? 'Array # to_a'는 스스로를 반환하기 때문에 검사 ​​할 필요가 없습니다. –

답변

3
def do_stuff(x) 
    x = x.lines.to_a if x.is_a? String 
    x 
end 

data = [ 
    "hello\nworld", 
    [1, 2, 3] 
] 

data.each do |item| 
    p do_stuff item 
end 

지금과를 제외하고 :

def do_stuff(x) 
    unless x.is_a?(Array) 
    x = x.lines.to_a 
    end 
    x 
end 

data = [ 
    "hello\nworld", 
    [1, 2, 3], 
    ['a', 'b'] 
] 

data.each do |item| 
    p do_stuff item 
end 

--output:-- 
["hello\n", "world"] 
[1, 2, 3] 
["a", "b"] 

그러나 Array 객체가 아닌 객체를 확인하는 것보다 String 객체를 확인하는 것이 더 중요합니다.

+0

기본적으로이 작업을 수행했습니다. if에서 if로 변경하고 String을 확인합니다. 지금 당장은 작동 중입니다. 감사! 나는이 문제가 왜 시작해야하는지 이해하지 못합니다. 분명히 2 행의 배열이라는 것에 대해 불평하지 않는 배열이었습니다. –

+0

@Jon Heckman, unless 절을 사용하여 예제를 게시하고 코드와 비교할 수 있습니다. – 7stud

0

lines 이후에 to_a이 필요하지 않습니다. 항상 배열입니다. 당신은이 작업을 수행 할 수 있습니다

case variablename 
when Array then variablename 
when String then variablename.lines 
else p variablename.class # For debugging. This should not happen. 
end 


이 검사 #Array:0x000000021382b8와 오류 메시지를 보면, variablename은 아마 Array 없습니다.

+1

[* "foo \ nbar"]는 Jon이 원하는 것이 아니기 때문에 [[ "foo \ n", "bar"]'가 아닌'[ "foo \ nbar"]'를 반환합니다 (Ruby 1.9 이상을 가정) . – sepp2k

+1

또한이 대답은 루비가 왜 코드가'variablename.is_a? (Array)'블록 내에 있지 않을 때'Variablename'이 Array 클래스의 객체라고 불평 할 것인가에 대해서는 설명하지 않습니다. 실제 질문. 물론 그럴 가능성이 가장 높습니다. Jon은 자신의 코드, 오류 메시지 및/또는 오류 위치를 허위 진술합니다. – sepp2k

+0

이 경우 OP가'[ "foo \ nbar"]'를 원한다고 생각했습니다. 그렇지 않다면, "질문"은 명확하지 않습니다 (실제로 OP의 "질문"에는 질문이 없습니다). – sawa

0

(is_a? String) 유형을 확인하는 대신 오브젝트가 변환에 필요한 메소드에 응답하는지 확인합니다. 당신이 라인의 배열로 또는 (멀티 라인) 문자열 중 하나를 제공하는 라인을 반복 할 것으로 가정하면,이 같은 작동합니다 :

def do_stuff(lines) 
    lines = lines.each_line if lines.respond_to?(:each_line) 
    lines.each do |line| 
    # do stuff 
    end 
end