【问题标题】:Iterate through array using Map and Select method Together in Ruby在 Ruby 中一起使用 Map 和 Select 方法遍历数组
【发布时间】:2013-01-03 16:16:38
【问题描述】:

我正在开发一个应用程序,但我遇到了以下代码。

我有一组链接,其中包含用户在表单中发布的一些链接。 比如说我的数组是bunch1 = ["google.com","http://yahoo.com"]

现在,在将它们存储到数据库之前,我需要确保每个链接的开头都添加了“http://”,因为我的 ActiveRecord 对象中有“验证:”逻辑。

所以我的逻辑是我将遍历数组并检查数组中每个链接之前是否存在“http://”字符串段。很明显,我必须在数组中的“google.com”之前添加“http://”字符串段。

所以我写了这样的代码:

bunch2=bunch1.map { |y| y="http://"+y }

但它会创建一个像 bundle2="http://google.com","http://http://yahoo.com"] 之类的 bundle2 数组

如您所见,它在“http://yahoo.com”之前添加了一个额外的“http://”。

为了解决这个问题,我修改了上面的代码如下:

bunch2 = bunch1.select { |x|  x !~ /http/ }.map { |y| y="http://"+y }

但它正在生成一个类似的数组 bunch2 = ["http://google.com"] 因为带有select方法的正则表达式正在消除yahoo.com

有人可以给我解决这个问题的方法吗?提前谢谢...

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    为什么不在map 的调用中进行测试?

    bunch2 = bunch1.map {|y| y !~ /^http/ ? "http://#{y}" : y }

    【讨论】:

    • 我复制了你的代码并运行了它。但它给了我一个错误说:语法错误,意外的'='。所以我把它改成“=~”而不是“~=”。但这一次它再次用“http://yahoo.com"...that”创建了同一个数组,再次在元素前添加了一个额外的“http://”。
    【解决方案2】:

    好的,伙计们,我已经找到了解决这个问题的方法。所以代码根本不需要 select 方法。它只需要一个三元运算符。所以我的一个班轮代码是这样的:-

    @bunch2=@bunch1.map { |x| x.match(/http:/) ? x : "http://"+x }
    

    上面的代码使用match方法进行正则表达式的匹配。如果找到匹配项,则元素不变,否则在开头添加“httP://”字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-12
      • 2019-09-10
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      相关资源
      最近更新 更多