新手问题 一个 关于 each_with_index 函数问题

exuxu · 2015年08月19日 · 最后由 exuxu 回复于 2015年08月19日 · 2404 次阅读

#data

@a = ["2","0","3"]
@b = ["a","b","c"]

#result,过滤掉 a 中值为 0 的元素,结果如下

@c = {"a"=>"2", "c"=>"3"}

        @b.each_with_index do |value, index|
                @c[value] = @a[index]
        end

这样可以可以获取所有的结果而无法过滤。

@b.each_with_index do |value, index|
  if @a[index] > 0
    @c[value] = @a[index]
  end
end

或者

@b.each_with_index do |value, index|
  @c[value] = @a[index]  if a[index] > 0
end

都么有效果,是为什么呢?

虽然还是不明白,不过我在结果中 用 reject 过滤了。

在 a 中 0 是个字符串,不是整数

Hash[@b.zip(@a)].select{|_,v| v!= '0' }

是不是因为"0" > 0抛出异常了?

最后一个代码块 if 后面的 a 掉了个@。

a 中存的都是字符串,不能和数子直接比较吧,要 to_i 一下。

@serco 可以实现楼主目的 @yanhao @391117134 正解,是会出现异常的:ArgumentError: comparison of String with #Fixmun failed

因为 String 和 Fixnum 不同,在比较是先检测后者的类型是否为 String, 然后是则比较,如果否则:检测后者是否定义了 to_str 方法,如果否则判断为不可比较,如果是则比较。

谢大家回复 #2 楼 @serco 可以用,我研究下语法啥的 #3 楼 @yanhao 应该是的 #4 楼 @391117134 应该是类型没有转换的问题 #5 楼 @mueven 学习了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号