基于整数变量在Ruby中创建字符串数组的好方法是什么?

时间:2016-02-12 16:59:12

标签: ruby-on-rails arrays ruby

整数变量是:

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代码添加到数组中?

4 个答案:

答案 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"

上面没有实现复数化要求,因为它实际上取决于你是否会有不规则的复数名词或其他什么。 我会使用其他答案中描述的哈希解决方案