【问题标题】:Ruby Retrieve mails with number of pairs without too much code modificationRuby 无需太多代码修改即可检索具有对数的邮件
【发布时间】:2021-07-08 10:04:16
【问题描述】:
email = []
start = 1
while start < 51
email.push ("jean.dupont.#{start}@email.fr")
start += 1
end
puts email
当我做puts email 时,我想检索所有只有偶数的邮件。
我在 google 或 stackoverflow 上看了很多,发现大多数人都在调整他们的代码,但我不想过多地触及我的代码,尽管我知道这是必要的。
使用此代码检索对等电子邮件的正确方法是什么?
【问题讨论】:
标签:
arrays
ruby
while-loop
numbers
【解决方案1】:
您可以在电子邮件数组上使用select 并使用[/\d+/] 提取号码并检查它是否甚至直接在puts 中,然后按该条件过滤
puts email.select { |e| e[/\d+/].to_i.even? }
[/\d+/] 相当于scan(/\d+/)[0]
【解决方案2】:
您可以做的最小更改是添加一个if 条件以仅在start 为偶数时推送元素(start.even?):
email.push("jean.dupont.#{start}@email.fr") if start.even?
但是,作为 Ruby,我认为您可以使用几种方法来完成类似的工作:
(1..50) # create a range of numbers from 1 to 50
.select(&:even?) # select from the range only those elements that are even
.map { |start| "jean.dupont.#{start}@email.fr" } # map each element to create a string using their values
.each(&method(:puts)) # iterate over each element and invoke `puts` using the element as the argument
一个很好的练习是重新考虑您的代码以提供相同的输出,但尽可能少做。例如,循环,如果您不需要奇怪的元素,那么使用它们毫无价值。您可以使迭代中的元素仅是您需要的元素。
以及您在开头声明的email 累加器。大多数情况下,您可以通过映射您的对象(作为 Hash 或 Array 实例或任何响应 map 的实例)来实现。