2012-12-06 31 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