eval返回字符串而不是值

时间:2016-01-27 04:34:28

标签: ruby

有人可以解释为什么eval返回字符串,而不是表达式的结果?

perms=["12+2","22","-2+"]
perms.each { |line|
matches=/^[\d]+[+-\/\*]{1}[\d]+$/.match(line)
s=matches.to_a
puts s
puts eval(s.to_s)
} 

2 个答案:

答案 0 :(得分:3)

s = matches.to_a是一个数组["12+2"]eval(s.to_s)将返回数组["12+2"],当您打印它时,您将获得输出12+2,数组["12+2"]的字符串表示形式。

您应eval数组元素,在本例中为s[0]s.first

修复如下:

perms=["12+2","22","-2+"]
perms.each do |line|
    matches=/^[\d]+[+-\/\*]{1}[\d]+$/.match(line)
    if matches
        s = matches.to_a
        puts eval(s.first)
    end
end
如果没有匹配,

matches可以是nil。仅在检查eval

nil不是if matches时才使用perms=["12+2","22","-2+"] perms.each do |line| puts eval(line) if line =~ /^[\d]+[+-\/\*]{1}[\d]+$/ end

您可以进一步简化代码并编写如下内容:

@Repository
public class RelationalDatabase 
{

    private JdbcTemplate jdbcTemplate;

    public RelationalDatabase(){}


    public RelationalDatabase(JdbcTemplate jdbcTemplate)
    {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Autowired
    public void setDataSource(javax.sql.DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    public JdbcTemplate getJdbcTemplate() {
        return jdbcTemplate;
    }


    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

}

答案 1 :(得分:0)

不是迭代输入,而是可以直接将它们映射到输出:

perms.map do |p|                      # map inputs to outputs
  eval(p) if p =~ /\A\d+[+-\/*]\d+\z/ # return eval’ed or nil
end.compact                           # get rid of nils

#⇒ [14]