Ruby on Rails中select合并多条件筛选哈希数组报语法错如何解决?
报错原因
这个错误是Ruby运算符优先级规则导致的语法解析错误:
- Ruby中
&&逻辑与运算符的优先级,高于无括号的方法调用优先级
你写的合并后代码:
f = a.select{ |g| g['done']== 'false' && g['subject'].include? 'send' }
Ruby解析时会按照优先级先绑定&&,等价于被错误解析为:
f = a.select{ |g| (g['done']== 'false' && g['subject'].include?) 'send' }
这就导致include?方法没有被正确传入参数,反而出现了孤立的'send'字符串,当解析到}时不符合语法规则,就抛出了“意外遇到}”的报错。
解决方法
以下三种写法都可以正常运行,最推荐第一种,可读性最高且能避免其他优先级隐患:
- 给
include?方法调用加上括号,明确参数范围
f = a.select{ |g| g['done']== 'false' && g['subject'].include?('send') }.pluck('id','done','subject')
- 用优先级更低的
and代替&&,and优先级低于无括号方法调用,可以正常解析
f = a.select{ |g| g['done']== 'false' and g['subject'].include? 'send' }.pluck('id','done','subject')
- 给两个判断条件分别加括号,明确计算顺序
f = a.select{ |g| (g['done']== 'false') && (g['subject'].include? 'send') }.pluck('id','done','subject')
内容的提问来源于stack exchange,提问作者wachichornia
相关产品推荐
相关产品推荐

