我有一个哈希x
。我想打印哈希x
,但对于那些BigDecimal
的值,我想打印他们的to_s
转换。我需要一个表达式来返回一个字符串;它不能是puts
中的一系列单独的print
或loop
。也许与join
。我可以在一行左右轻松完成这项工作吗?
答案 0 :(得分:2)
由于您尚未指定要将结果加入的字符串,因此我假设您要加入""
,这是默认值。 join
会自动应用to_s
。
puts x.values.grep(BigDecimal).join
我可能误解了这个问题,因为它不清楚。如果您要打印所有值,但将to_s
应用于某些值,则不需要特殊操作,因为join
会自动应用to_s
。
puts x.values.join
答案 1 :(得分:1)
X.each do |key, value|
value.class == BigDecimal ? puts value.to_s : puts value
end
或
X.each { |key, value | value.class == BigDecimal ? puts value.to_s : puts value }
查看三元运算符。
编辑:
同样关于您编辑的问题,请求一个字符串:
new_array = X.map {|object| object.class == BigDecimal ? object.to_s : object }
然后将其转换为new_array.join("")
答案 2 :(得分:0)
迭代所有键/值对并执行简单的类型检查:
X.each do |k, v|
v.is_a?(BigDecimal) ? puts v.to_s : puts v
end
您也可以使用is_a?
代替instance_of?
。
修改强>
要符合 新要求 ,请先使用map为values构建一个数组:
strArr = X.values.map { | v | v.is_a?(BigDecimal) ? v.to_s : v }
现在使用join:
从数组创建一个字符串myStr = strArr.join("[SEPARATING CHARACTER]")
答案 3 :(得分:0)
以前的答案可以很好地打印值,但不会像OP请求那样返回单个字符串。我建议使用map首先将结果值放在数组中,然后使用连接(使用您选择的分隔符)。
values_array = x.map{ |k,v| v.is_a?(BigDecimal) ? v.to_s : v }
values_string = values_array.join(",")
您也可以在地图块的末尾执行.join
方法,但为了清晰起见,我认为我会将其分开。
答案 4 :(得分:0)
这就是我想要的:
"{" + (x.map {|key, value| "#{key}: #{value.is_a?(BigDecimal) ? value.to_s("F") : value}" }).join(", ") + "}"