Ruby 除非值为true,否则将哈希展平为字符串

Ruby 除非值为true,否则将哈希展平为字符串,ruby,string,hash,string-formatting,map-function,Ruby,String,Hash,String Formatting,Map Function,我需要将a中的键和值转换为字符串。有时,值是true,在这种情况下,不应打印值,只应打印键 例如 我是这样做的: opts_string = opts.map{|k,v| "#{k}"+ (v.is_a?(TrueClass) ? "" : "=#{v}") }.join(' ') # => "fail_timeout=8s slow_start=130s resolve" 有更简单的方法吗?选择注入(“”{memo,(k,v)| memo选择注入(“”{memo,(k,v)| memo

我需要将a中的键和值转换为字符串。有时,值是
true
,在这种情况下,不应打印值,只应打印键

例如

我是这样做的:

opts_string = opts.map{|k,v| "#{k}"+ (v.is_a?(TrueClass) ? "" : "=#{v}") }.join(' ')
# => "fail_timeout=8s slow_start=130s resolve"

有更简单的方法吗?

选择注入(“”{memo,(k,v)| memo
选择注入(“”{memo,(k,v)| memo单向使用
v==true

opts.inject("") { |memo, (k,v)| memo << (v == true ? k : [k,v].join("=")) + " " }.strip
opts.map { |k,v| v == true ? k : "#{k}=#{v}" }.join(' ')     
#=> "fail_timeout=8s slow_start=130s resolve"

单向使用
v==true

opts.map { |k,v| v == true ? k : "#{k}=#{v}" }.join(' ')     
#=> "fail_timeout=8s slow_start=130s resolve"


你的解决方案有什么问题?
opts.map{k,v{124; true==v?k:“{k}={v}”。join(“”)
简化了真正的计算。我认为你对它很在行…(y)其他解决方案只是变化,不一定如此better@sschmeck-这是一个很好的解决方案,我将使用:)我的解决方案唯一的问题是,它看起来太长和笨拙。值是字符串还是
true
?您的解决方案有什么问题?
opts.map{k,v | true==v?k:#{k} =#{v}}.join(“”)
简化了真正的计算。我认为您对它很在行…(y)其他解决方案只是变化,不一定如此better@sschmeck-这是一个很好的解决方案,我将使用:)我的解决方案唯一的问题是,它看起来太长太笨拙了。值是字符串还是
真的
?它没有给出预期的输出它没有给出预期的输出我更喜欢它我的
注入
答案。不需要
备忘录
。为什么
平面图
而不是
平面图
?应该注意的是,斯切梅克在我面前的评论中给出了这个答案,而我最初独立使用了
平面图
,直到法汉默隆博士指出了重构。这两个答案都是值得赞扬的,因此,这个答案已经成为一个很好的答案社区wiki.on旁注(根据上下文,这是一个非常小的旁注)@sschmeck的注释实际上性能稍好一些。使用
true
作为接收器而不是参数似乎开销较小。@engineersmnky
TrueClass
继承自
BasicObject
,它只检查对象标识,而
String
涉及一些类型检查。我更喜欢这样我的
注入
答案。不需要
备忘录
。为什么
平面图
而不是
平面图
?应该注意的是,斯切梅克在我面前的评论中给出了这个答案,而我最初独立使用了
平面图
,直到法汉默隆博士指出了重构。这两个答案都是值得赞扬的,因此,这个答案已经成为一个很好的答案社区wiki.on旁注(根据上下文,这是一个非常小的旁注)@sschmeck的注释实际上性能稍好一些。使用
true
作为接收器而不是参数似乎开销较小。@engineersmnky
TrueClass
继承自
BasicObject
,它只检查对象标识,而
String
涉及一些类型检查。
opts.map{|k, v| v == true ? [k] : [k, v]}
    .map{|tuple| tuple.join('=')}
    .join(' ')