【问题标题】:How do I map a function to every element of my array?如何将函数映射到数组的每个元素?
【发布时间】:2017-12-29 14:28:19
【问题描述】:

我使用的是 Ruby 2.4。如何将复杂函数映射到字符串数组中的每个元素?功能是

elt.gsub!(/\A\p{Space}+|\p{Space}+\z/, '')

假设“elt”是我的字符串数组中的一个元素。这是一个美化的“脱衣舞”功能。我想将它应用到我的数组中的每个项目。

【问题讨论】:

  • 你试过map吗?
  • 我不知道 .map(&:strip),但它如何与更复杂的函数一起工作?
  • 几个月前你还知道:stackoverflow.com/q/44032605/1672429。而你怎么有 138 道 Ruby 问题却不知道如何使用积木?
  • @StefanPochmann 我相信,根据他的问题历史,他主要是为了其他观众而提出他知道答案的问题。我相信,这种行为在 SO 上并不气馁。关于这类事情可能有一两个元主题,我从未见过它皱眉。
  • Groovy,谢谢。

标签: arrays ruby strip


【解决方案1】:

您正在寻找的是块语法。

new_arr = arr.map { |elt| elt.gsub(/\A\p{Space}+|\p{Space}+\z/, '') }

大括号内的任何内容都将被视为map 的“函数”。对于较长的块,您可以使用do .. end

new_arr = arr.map do |elt|
  elt.gsub(/\A\p{Space}+|\p{Space}+\z/, '')
end

在语义上是等价的。

【讨论】:

  • 或者甚至mangle = ->(elt) { elt.gsub(...) }; arr.map(&mangle),如果块更复杂并且可以从解释性名称中受益。
  • 更正: do end在语义上几乎等同于{},但 完全。有一个很少被考虑到的缺点,但它们具有不同的优先级puts [42].map { |e| e } 返回 42,而 puts [42].map do |e| e end 返回一个 Enumerator 实例令人惊讶。 Details.
  • @mudasobwa:不,Silvio 是正确的,它们在语义上是等价的。优先级是语法问题,而不是语义问题。
  • @JörgWMittag 返回不同事物的两个子句在语义上不可能是等价的,AFAIU。
  • do .. end{ .. } 语法在语义上是等价的。我仍然坚持我的说法。运算符优先级的问题在解析时得到解决。如果您有一个包含do .. end{ .. } 的抽象语法树,您可以随时将其替换为相反的并获得等效代码。
【解决方案2】:

如果您了解.map(&:strip),您可能知道您需要的一切,语法对于proc 或可能转换为proc 的任何内容都没有区别(阅读:对#to_proc 的回复。)@987654325 @ 响应 #to_proc,这就是 .map(&:strip) 起作用的原因。 procs 回复 #to_proc,返回自我。也就是说,以下内容将完美工作(map 不需要在那里(each 足够好),因为它使用 banged grep! 修改所有内容,但为了保持一致性,让它保留):

.map(&->(x) { x.gsub!(/\A\p{Space}+|\p{Space}+\z/, '') })

【讨论】:

  • 它比块解决方案有优势吗?对我来说,它只会看起来更长更复杂。 (我想我以前见过你喜欢这种风格,这就是我问的原因。)
  • @StefanPochmann 不,不,一点也不,这个特殊的 sn-p 没有任何优点(它有缺点:)。我发布这个只是为了吸引 OP(众所周知,他会用愚蠢的问题追逐代表,)说如果他们知道如何使用 & 符号,他们就走了。只有当它更简洁、更清晰并且允许 DRY 时,我才更喜欢 & 符号。
猜你喜欢
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 2021-01-19
相关资源
最近更新 更多