【问题标题】:Ruby: map an array of keys to values shorthandRuby:将一组键映射到值的简写
【发布时间】:2013-01-07 08:10:00
【问题描述】:

我最近刚开始使用 Ruby,我希望有一种速记方法可以将绑定方法用作我缺少的 proc。我基本上是在尝试这样做

SYMBOLS = {"I" => 1, "V" => 5, "X" => 10, ... }

roman = "zXXIV".upcase.chars.collect { |c| SYMBOLS[c] }
=> [nil, 10, 10, 1, 5]

我觉得在 ruby​​ 中应该有一个简单的方法来使用 SYMBOLS[] 作为绑定方法,所以只是

roman = str.upcase.chars.collect &:SYMBOLS[]

解决方案 Ruby 1.9.3

roman = SYMBOLS.values_at(*str.upcase.chars)

【问题讨论】:

    标签: ruby hash map proc collect


    【解决方案1】:
    SYMBOLS.values_at(str.upcase.chars.to_a)
    

    关于使用SYMBOLS[],您仍然需要将字符传递给方法。

    您可以通过SYMBOLS.method(:[])获取方法,例如,

    > p = SYMBOLS.method(:[])
    > p.call("X")
    => 10
    

    我不相信在这种情况下它是最易读的——对我来说,调用map 并传入SYMBOLS[],虽然简洁且实用,但比我更喜欢延迟理解正在发生的事情。

    【讨论】:

    • 太好了,有没有更通用的方法?
    • @agoebel Hash.values_at 有什么不一般的地方?
    • 我想我仍然需要更好地了解 ruby​​ 对象模型。我只是想知道如果我有一个想要做同样事情的自定义类/方法的通用解决方案。
    • @agoebel 然后按照 Phrogz 的建议使用 map 是您应该接受的答案。
    【解决方案2】:
    SYMBOLS = {"I" => 1, "V" => 5, "X" => 10 }
    roman = "zXXIV"
    
    p roman.chars.map(&SYMBOLS.method(:[]))
    #=> [nil, 10, 10, 1, 5]
    

    【讨论】:

    • +1,IMO 这可能更好。我还没有决定。我实际上认为values_at 更具交流性,我猜。但我的反对意见是沟通,而不是技术。
    猜你喜欢
    • 2018-03-10
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    相关资源
    最近更新 更多