我遇到了一些有趣的事情,我认为这与操作员优先级有关,但不确定我是否只是留下了一些东西。我想在我的.group_by
排序中对Rails中的数据库查询使用三元语句。所以我有这样的东西有效:
@tools = Tool.all.group_by {|tool| tool.name}
#=> @tools {'anvil' => [<#tool....
返回哈希工具对象,分组为名称相同的键。然后提出将它们按字母组排序,名字的第一个字母将是所需的输出,所以:
@tools = Tool.all.group_by {|tool| tool.name.downcase[0] }
#=> @tools {'a' => [<#tool.....
太棒了,现在我有一个按名字第一个字母分组的工具哈希值。但是,如果一个名字以其他一些东西开头呢?不是问题,它只是拉出第一个字符并将其用于组,因此工具名称以&#34; 1&#34;开头。进入哈希成员,其键是&#34; 1&#34;。对于不是字母的非数字字符也是如此。
这里有一个问题:我可以使用条件语句选择将我的所有字母名称排序成字母组,但将其他所有内容放入一个组中,其中包含一些键,如#34;#&#34 ;。但我不能用三元声明来做这件事:
@tools = Tool.all.group_by {|tool| if ('a'..'z').include? tool.name.downcase[0] then tool.name.downcase[0] else '#' end }
效果很好!我将所有非字母名称分类到散列的@tools['#']
部分。
但这不起作用:
@tools = Tool.all.group_by {|tool| ('a'..'z').include tool.name.downcase[0] ? tool.name.downcase[0] : '#' }
它返回仅包含两个成员的哈希:@tools[true]
和@tools[false]
。我可以理解为什么,作为一个三元运算符返回真或假,但它不应该像if-then-else语句一样?它必须是group_by跳枪的东西?
有没有办法调整group_by语句的语法,使三元运算符像我想要的那样工作?我已经尝试在parens()中附上两个return语句,但这似乎没有用。我在parens中尝试了整个三元语句,希望在返回group_by函数之前评估整个事情......任何想法?
答案 0 :(得分:1)
这是由ruby解析为
('a'..'z').include?(tool.name.downcase[0] ? tool.name.downcase[0] : tool.name = '#')
与('a'..'z').include?(tool.name.downcase[0])
相同,假设没有名称为空?它等同于您之前的版本
('a'..'z').include?(tool.name.downcase[0]) ? tool.name.downcase[0] : tool.name = '#'
顺便说一句,实际上用tool.name='#'
更改名称对我来说听起来真是个坏主意。这可能没关系,但以后可能会轻易咬你。