2016-09-12 4 views
0

현재 해시의 모든 문자열 값을 소문자로 조정하려고합니다. 이 해시에는 여러 값 유형 (nil, string, integer)이 포함되어 있으므로 해시가 포함 된 전체 해시를 실행하면 해시의 nil 값으로 인해 오류가 발생합니다.Ruby - nil 값도 포함하는 해시의 문자열 값을 아래쪽으로 자릅니다.

NoMethodError: undefined method "downcase!" for nil:NilClass 

나는 루비에 새로운 꽤 브랜드 그리고 난이 해시를 통해 실행하고 무기 호 또는 정수 값을 건너 최선의 방법 확실하지 않았다. .map을 사용하여 모든 값을 문자열로 변환 한 다음 값을 소멸 시키려고 시도했지만 최종 결과에서 차이가 보이지 않거나 오류가 발생합니다.

testHash = testHash.map(&:to_s) 
testHash.map(&:downcase!) 
(I've also attempted testHash.each {|k,v| v.downcase!} 

저는 루비에서 올바르게 작성하는 방법을 알지 못한다고 확신합니다. 추가 정보가 필요한 경우 알려 주시고 고맙습니다.

답변

2

확인 값이

testHash.each { |k, v| v.downcase! if v.is_a?(String) } 
+0

나는 이것을 돌았으며 오류없이 진행됩니다. 그러나 내가 아는 가치 중 하나를 호출 할 때 대문자가있을 때 대문자로 표시됩니다. 그것이 실제로 조절되지 않는 이유는 무엇입니까? 다운 케이스의 끝에서? – Laura

+4

당신은 또한'v.downcase! if v.respond_to? (: downcase!)'이는 약간 더 duck-typish입니다. 때로는 물건이 * 할 수있는 것보다 * 할 수있는 것을 묻는 것이 더 나을 때가 있습니다. – meagar

+0

로라,이 작동합니다. 이것이 작동하지 않는 예제 해시를 보여주기 위해 질문을 편집 할 수 있습니까? 예제에는 몇 개의 키만 포함하십시오. 아마도 2 개 또는 3 개의 키만 포함하면됩니다. –

1
h = {a: nil, b: "Someword", c: 1} 
h.map {|k,v| v.downcase! if v.is_a? String} 
puts h #=> {:a=>nil, :b=>"someword", :c=>1} 

이 작동 downcasing 전에 유효한 문자열 인 경우. 해시를 통해 매핑하고 문자열 값을 확인한 다음 downcase! 메서드를 실행합니다.