在迭代哈希时,每个迭代器中的轨道行为都有奇怪的ruby

时间:2014-09-16 19:22:12

标签: ruby-on-rails ruby

我正在使用Ruby on Rails创建一个网站。 我有一个看起来像这样的常量:

SIZE_CONVERT = {
shoes: {
    men: {
        '1'    => ['32',   '19,7', '32',   '0.5'  ],
        '1.5'  => ['32.5', '20.3', '32.5', '1'    ],
        '2'    => ['33',   '20.6', '33',   '1.5'  ],
        '2.5'  => ['33.5', '21',   '33.5', '2'    ],
        '3'    => ['34',   '21.6', '34',   '2.5'  ]}}}

当我为迭代此哈希的模型创建方法时,它表现得很奇怪。我想返回一个看起来像SIZE: 34的字符串,或者只返回No match字符串。但是,当我调用此方法时,它不会返回一个字符串,它会返回我所有的SIZE_CONVERT[:shoes][:men]哈希值。

def convert_shoe(gender, size)
    if size.to_f < 3.0
        SIZE_CONVERT[:shoes][gender].each do |s|
            if size == s[1][3]
                "SIZE: " + s[1][2]
            else
                "No match"
            end
        end
    end
end

1 个答案:

答案 0 :(得分:3)

这是因为你要返回最后一个评估的表达式,在这种情况下是

的返回

        SIZE_CONVERT[:shoes][gender].each do |s|
            if size == s[1][3]
                "SIZE: " + s[1][2]
            else
                "No match"
            end
        end

[1,2,3,4] .each返回[1,2,3,4],所以SIZE_CONVERT [:shoes] [性别](数组)将在.each方法上返回该数组

您可以通过返回匹配

来解决此问题

def convert_shoe(gender, size)
    if size.to_f < 3.0
        SIZE_CONVERT[:shoes][gender].each do |s|
            if size == s[1][3]
                return "SIZE: " + s[1][2]
            end
        end
    end
    return "No match"
end
但是最后,虽然正在做这项工作,但是还不够rubyist,你可以使用功能很酷的东西,比如Array #find方法,这样:


def convert_shoe(gender, size)
    if size.to_f < 3.0
        found_size = SIZE_CONVERT[:shoes][gender].find do |s|
            size == s[1][3]
        end
        return "SIZE: " + found_size[1][2] if found_size
    end
    "No match"
end