有人可以解释为什么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)
}
答案 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]