2012-12-06 36 views
0
pry(main)> s = {:a =>2, :d=>'foo', :x => ' ', :n => true, :z => nil} 
=> {:a=>2, :d=>"foo"} 
pry(main)> s.each do |k,v| p k unless v.empty? end 

NoMethodError: undefined method `length' for 2:Fixnum 

我知道這是因爲fixnum沒有空方法。那麼如何在光滑的的方式下解決這個問題,先沒有討厭查找數據類型然後檢查它?我想打印那些k,其中v有一定的價值。是true被認爲是一個值,但不是一堆空格。對我來說「有價值」是指非空字符和布爾真。提取紅寶石中的非空值

+1

你是什麼意思是「一些價值」? 「真」具有一定的價值嗎? – Amadan

+0

是'true'有價值 – JVK

+2

它不工作的原因是Ruby不知道你的意思。我們也一樣。 「空」是什麼意思?你的意思是'!無?'?你列出哪些值爲「沒有價值」? 'nil'?還要別的嗎? – Casper

回答

1

,並提供更新的意見,我認爲這是你想要的。

s = {:a =>2, :d=>'foo', :x => ' ', :n => true, :z => nil} 
s.each { |k,v| p(k) if !!v && !v.to_s.strip.empty? } 
# :n 
# :d 
# :a 
+0

謝謝。選擇你的答案。 – JVK

1

快速的解決方案:

s.each {|k,v| p k unless v.to_s.empty?} 
+0

正如我所說,我不想做數據檢查,並且轉換 – JVK

+0

@JVK看起來像是一個完美的解決方案,它甚至非常優雅地覆蓋'nil'的情況!你可能想放鬆你的約束。 – akuhn

+0

@akuhn JVK認爲「'」是一個空值。 – oldergod