整数变量是:
toonie = 2, loonie = 1, quarter = 1, dime = 0, nickel = 1, penny = 3
我希望最终输出为
"2 toonies, 1 loonie, 1 quarter, 1 nickel, 3 pennies"
有没有办法从[]数组括号内的Ruby代码中插入这一切,然后添加.join(“,”)?
或者我是否必须首先声明一个空数组,然后如果整数变量大于0,则编写一些Ruby代码添加到数组中?
答案 0 :(得分:2)
我会做这样的事情:
coins = { toonie: 2, loonie: 1, quarter: 1, dime: 0, nickel: 1, penny: 3 }
coins.map { |k, v| pluralize(v, k) if v > 0 }.compact.join(', ')
#=> "2 toonie, 1 loonie, 1 quarter, 1 nickel, 3 penny"
请注意,pluralize
是一种ActionView::Helpers::TextHelper
方法。因此,它仅在视图和帮助程序中可用。
如果您想在视图之外使用示例,可能需要使用ActiveSupport
中的pluralize
代替 - 这使解决方案稍长一些:
coins.map { |k, v| "#{v} #{v == 1 ? k : k.pluralize}" if v > 0 }.compact.join(', ')
#=> "2 toonie, 1 loonie, 1 quarter, 1 nickel, 3 penny"
答案 1 :(得分:1)
我不确定你究竟在找什么,但我会从像:
这样的哈希开始coins = {"toonie" => 2, "loonie" => 1, "quarter" => 1, "dime" => 0, "nickel" => 1, "penny" => 3}
然后您可以使用它来打印计数
def coin_counts(coins)
(coins.keys.select { |coin| coins[coin] > 0}.map {|coin| coins[coin].to_s + " " + coin}).join(", ")
end
如果您想要适当的复数,您可以执行以下操作:
include ActionView::Helpers::TextHelper
def coin_counts(coins)
(coins.keys.select { |coin| coins[coin] > 0}.map {|coin| pluralize(coins[coin], coin)}).join(", ")
end
答案 2 :(得分:1)
可以在rails中完成:
hash = {
"toonie" => 2,
"loonie" => 1,
"quarter" => 1,
"dime" => 0,
"nickel" => 1,
"penny" => 3
}
hash.to_a.map { |ele| "#{ele.last} #{ele.last> 1 ? ele.first.pluralize : ele.first}" }.join(", ")
基本上你要做的是将哈希值转换为数组,如下所示:
[["toonie", 2], ["loonie", 1], ["quarter", 1], ["dime", 0], ["nickel", 1], ["penny", 3]]
然后将每个元素映射到提供的函数,它接受内部数组,获取最后一个条目中的数值,将其放在一个字符串中,然后根据刚检查的数值添加复数或奇异值。最后将它们合并在一起
=> "2 toonies, 1 loonie, 1 quarter, 1 nickel, 3 pennies"
答案 3 :(得分:0)
这只是为了好玩而不应该用于制作,但你可以像
那样实现它def run
toonie = 2
loonie = 1
quarter = 1
dime = 0
nickel = 1
penny = 3
Kernel::local_variables.each_with_object([]) { |var, array|
next if eval(var.to_s).to_i.zero?
array << "#{eval(var.to_s)} #{var}"
}.join(', ')
end
run # returns "2 toonie, 1 loonie, 1 quarter, 1 nickel, 3 penny"
上面没有实现复数化要求,因为它实际上取决于你是否会有不规则的复数名词或其他什么。 我会使用其他答案中描述的哈希解决方案