【问题标题】:How do I create three objects with one line of code?如何用一行代码创建三个对象?
【发布时间】:2011-06-19 08:55:22
【问题描述】:

如何用一行代码创建三个空哈希?

我知道a = b = c = Hash.new 不起作用,因为它会创建三个对同一个 Hash 对象的引用。

a,b,c = Hash.new 会将Hash 分配给a,但bc 仍然是nil

我知道我可以做到a, b, c = Hash.new, Hash.new, Hash.new,但这看起来不太干。

【问题讨论】:

  • 这三个哈希值必须来自某个地方
  • @delnan 那么,创建一个类的多个实例没有捷径吗? :(
  • 由于您的Hash.new 调用既不使用参数也不使用块,您可以将其缩短为a, b, c = {}, {}, {}
  • 可能有“克隆此 N 次”的表达式,它可以工作,但不会更短。如果你经常需要这个以成为一个问题,那么你可能做错了什么(例如,没有足够地使用集合)。
  • 我只需要它一次,但我很好奇它是否可能。可能不会。 :(

标签: ruby variable-assignment


【解决方案1】:

正如我作为评论发布的那样,我认为a, b, c = {}, {}, {} 是最好的方式,因为它简短且易于阅读。如果您真的想以更复杂的方式进行操作,则可以使用以下方法:

>> a, b, c = Array.new(3) { Hash.new } #=> [{}, {}, {}]
>> a #=> {}
>> b #=> {}
>> c #=> {}

【讨论】:

  • 好吧,我一直在寻找一种语言结构,但既然没有,而且我最喜欢你的答案,我会接受它。不过,所有其他答案也都很好。 (我自己也尝试过使用3.times.map { Hash.new},但我对它不太满意)。谢谢大家:D
【解决方案2】:

我不确定我是否会使用它,但有可能:

a, b, c = 3.times.map { Hash.new }
# or
a, b, c = (1..3).map { Hash.new }

【讨论】:

    【解决方案3】:

    虽然你已经标记了一个答案,但我会用另一种我认为最简单的方式抛出:

    a,b,c = [{}]*3
    

    【讨论】:

    • 看起来这会将abc 设置为同一个哈希实例。 >> a,b,c = [{}]*3 #=> [{}, {}, {}] >> b[1]=1 #=> 1 >> a #=> {1=>1} >> c #=> {1=>1}
    • 它将所有三个设置为相同的哈希值。原因是 Ruby 先分配了{},然后复制了三遍。它不会复制三个 {} 数组然后分配它们。
    【解决方案4】:

    我不确定我是否会使用它,但有可能:

    a, b, c = 3.times.map { Hash.new }
    #or
    a, b, c = (1..3).map { Hash.new }
    

    还有另一个答案.. 因为您可以简单地使用 {} 而不是 Hash.new 分配可能是这样的:

    a, b, c = 3.times.map{{}}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多