2016-03-13 197 views
-1

我想從這個數組只輸出整數值。評估字符串檢查整數

perms=["12+2*4","2+2","-2+","12+34-","12-3/4"] 
perms.each do |line| 
    if (line.to_s =~ /^\d+(?:[+\/*-]\d+)*$/) 
     puts "#{line}" 
     if(!(eval(line).to_s=~ /\A\d+\z/)) 
      puts "#{line}=#{eval(line)}" 
     end 
    end 

我越來越:

12+2*4 
2+2 
12-3/4 

,而不是我所期待的:

12+2*4 
12+2*4=20 
2+2 
2+2=4 

(12-3/4的值不爲整數所以不應該被包括在內)

+0

'12-3/4#=> 12' – steenslag

回答

1

如果=~運算符與正則表達式不匹配,則返回nil。如果它找到了匹配,它將返回找到的匹配的偏移量。正因爲如此,你要麼預期nilinteger。你的第二條陳述是否定比賽所返回的內容。如果你否定nil,你會得到true,但是如果你否定了一個整數,你會得到false。這意味着你的邏輯是倒退的。通過添加檢查nil邏輯將按預期工作。

perms=["12+2*4","2+2","-2+","12+34-","12-3/4"] 
perms.each do |line| 
    if (line.to_s =~ /^\d+(?:[+\/*-]\d+)*$/) 
     puts "#{line}" 
     if(!(eval(line).to_s =~ /\A\d+\z/).nil?) 
      puts "#{line}=#{eval(line)}" 
     end 
    end 
end 

有了這種理解,你甚至可以完全消除否定操作,以達到相同的結果。爲了解決這個問題,而不是兩次,你可以將它存儲在一個變量中,但這更多的是關於偏好。

perms=["12+2*4","2+2","-2+","12+34-","12-3/4"] 
perms.each do |line| 
    if (line.to_s =~ /^\d+(?:[+\/*-]\d+)*$/) 
     puts "#{line}" 
     result = eval(line) 
     if(result.to_s =~ /\A\d+\z/) 
      puts "#{line}=#{result}" 
     end 
    end 
end