Ruby中用rindex查找start非空dest为空元素索引报错求助
问题分析与解决
首先看你的需求:要找到start不为nil但dest为nil的元素索引,但你的代码存在两个关键问题,导致语法/逻辑错误:
1. 哈希元素的访问方式错误
你的数组元素是Ruby哈希(Hash),不是自定义类的对象,所以不能用.start这种属性访问方式。哈希需要通过键来获取值,比如你定义的哈希用的是字符串键"start",就应该用x["start"];如果是符号键:start(新版Ruby中"start":等价于:start =>),就用x[:start]。直接用.start会触发NoMethodError,因为哈希没有start这个方法。
2. 匹配条件写反了
你原代码的条件是x.start.nil? && x.dest.nil?,这是在找start和dest都为nil的元素(也就是数组里的第三个元素),和你要找的“start不为nil、dest为nil”完全相反。正确的条件应该是!x[:start].nil? && x[:dest].nil?(如果在Rails环境下,也可以用x[:start].present? && x[:dest].nil?,更简洁)。
修正后的代码示例
假设你的哈希用的是符号键(和你给出的数组格式一致),正确的代码如下:
# 先定义你的数组 testArr = [ { "start": "2020-10-9", "dest": "2020-10-10" }, { "start": "2020-10-10", "dest": nil }, { "start": nil, "dest": nil } ] # 获取最后一个符合条件的元素索引(用rindex) index = testArr.rindex { |x| !x[:start].nil? && x[:dest].nil? } puts index # 输出:1 # 如果要获取第一个符合条件的元素索引,用index即可 first_index = testArr.index { |x| !x[:start].nil? && x[:dest].nil? } puts first_index # 输出:1
如果你的哈希确实是字符串键(比如{ "start" => "2020-10-9" }),只需要把x[:start]改成x["start"]即可。
内容的提问来源于stack exchange,提问作者Ashy Ashcsi
相关产品推荐
相关产品推荐

