【问题标题】:Why don't the collect and each methods work the same way with the succ method? [duplicate]为什么 collect 和 each 方法与 succ 方法的工作方式不同? [复制]
【发布时间】:2011-12-21 10:58:57
【问题描述】:

["H", "A", "L"].collect {|x| x.succ } # => ["I", "B", "M"] 但是

["H", "A", "L"].each {|x| x.succ } # => ["H", "A", "L"]

是什么导致这里的输出不同?

succ 方法增加一个字符串。

【问题讨论】:

    标签: ruby


    【解决方案1】:

    使用 each_char 的替代方法:

    "HAL".each_char.map {|x| x.succ } # => ["I", "B", "M"]
    

    或者只是地图

    ["H","A","L"].map {|x| x.succ } # => ["I", "B", "M"]
    

    干杯:)

    【讨论】:

    • 第一个也可以写成:"HAL".chars.map(&:succ)
    • 不错的托克兰...这激发了这一点:"HAL".chars.map(&:succ).inject(""){|s,c| s "IBM"
    • with join: "HAL".chars.map(&:succ).join #=> "IBM"
    • "HAL".chars.inject(""){|s,c| s
    【解决方案2】:

    Array#each 中块的结果被完全丢弃,each 的结果是数组本身(这就是你得到原始["H","A","L"] 的原因)。在这里,您需要一个 collect/map,如您在第一个 sn-p 中所示(创建一个新数组并保持旧数组不变)。

    each 的输出被丢弃,因为each 是经典的命令式for-loop:你需要做一些副作用(从文件中读取,打印到屏幕,更新数组/散列,...) 以有效地做某事。

    我的建议是避免使用each,除非有充分的理由。我的意思是,例如,可以使用每个行将行写入文件,但永远不要模拟 mapselectinject 或其他 FP abstractions

    【讨论】:

    • 你能解释一下吗,为什么用 Enumerable#each 丢弃输出?
    • 这就是它的工作方式。对操作感兴趣时使用each;如果您对输出感兴趣,请使用 collect 或其同义词 map。阅读文档以获取更多信息。
    猜你喜欢
    • 2022-11-03
    • 2013-12-23
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2023-02-25
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多