【问题标题】:Dynamically create Hash and Arrays动态创建哈希和数组
【发布时间】:2012-06-29 00:27:31
【问题描述】:

我正在寻找解决问题的 Ruby-est 方法。

我的应用程序中有与此类似的代码:

data = [1,2,3,4]
a = []
b = []
h = {}
data.each do |val|
  h[val] = func1(val)
  a.push func2(val)
  b.push func3(val)
end

当然,这是一种简化。给定这样的代码,我想做的是消除这个 sn-p 的第 2-4 行,这样我就有了类似的东西:

 h, a, b = data.some_func{|val|
   # do something
 }

我的直觉是 map 还不够,但我不确定我需要什么。我的代码有效,但看起来不是很红润。我应该在这里做什么?

【问题讨论】:

    标签: ruby syntactic-sugar


    【解决方案1】:

    也许它并不完全符合您的要求,但至少它是可读的:

    data = [1,2,3,4]
    h = data.each_with_object({}) { |e, m| m[e] = func1(e) }
    a = data.map &method(:func2)
    b = data.map &method(:func3)
    

    不过,正如您所说,您的示例是对实际任务的简化,因此它可能不适合您。在这种情况下,我建议您保留原来的解决方案。

    【讨论】:

    • 谢谢。我会使用类似的东西,我很确定。我可能过于简化了我的示例 - 在实际代码中,a 和 b 是根据对 h 中的内容的引用进行初始化的,所以我认为 h 上的 each_with_object 然后创建 a 和 b 将删除空的 inits 而不会影响可读性。
    【解决方案2】:

    我认为我的例子不是最好的,但是......你可以决定

    h, a, b = data.each_with_object([ {}, [], [] ]) do |val, obj|
      obj[0][val] = func1 val
      obj[1] << func2(val)
      obj[2] << func3(val)
    end
    

    编辑:除非您理解each_with_object,否则这很难阅读……也许您最初的解决方案是最好的方法。

    【讨论】:

    • 无意冒犯,但这太可怕了。不过,看起来这就是 OP 所要求的。
    • @KL-7 我同意。我不会这样做。只是回答OP的问题。
    • 你愿意详细说明是什么让它变得可怕吗?我要求学习,所以如果我的方法很遥远,我宁愿采用一种新方法,也不愿达到一个糟糕的目标。
    • @asfallows,您在问题中的解决方案有这些明确的数组初始化,这可能看起来不够酷,但很容易理解您想要实现的目标。提供的解决方案消除了显式初始化,但不清楚你为什么用这样的模因调用each_with_object。此外,如果您在块中添加更多代码,则很容易迷失在这些 obj[0]obj[1]obj[2] 中。
    • 没错。如果您想构建另一个阵列,则有 2 个点需要编辑,并且可能会搞砸!
    猜你喜欢
    • 2018-01-23
    • 1970-01-01
    • 2014-04-13
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2012-02-09
    • 1970-01-01
    相关资源
    最近更新 更多