2015-11-19 60 views
0

["if", "2", "<", "4"]不使用eval

執行在Ruby中的比較我如何串在一起,這些並計算出它們是否是真實的,而不使用.eval()

爲了便於說明,上面只是一個數組,我需要操縱內容以便評估if 2 < 4,這應該返回true

+0

'[「if」,「2」,「<」,「4」]'這甚至不是有效的Ruby代碼。你應該更清楚地說明你需要什麼以及你有什麼數據作爲輸入 – fl00r

+0

@ fl00r我知道它是無效的。我有一個有四個字符串的數組,我想轉換它們,所以我可以評估'if 2 <4',返回'true'。 – sscirrus

+0

不知道if,但你可以做'2.send('<',4)'並且得到'true'。將這些變量包含在變量中,並且你在那裏的一部分。儘管如何區分''2「'和'2',我不知道。 ''19'.send('<','2')'也是'true'。 –

回答

0

您可以嘗試解析您的語句並將其組合成更復雜的東西。

def bool_parse(statement) 
    op, left, method, right = statement 
    left = left.to_i unless left["\'"] 
    right = right.to_i unless right["\'"] 

    case op 
    when "if", "elsif" 
    left.send(method, right) 
    when "unless" 
    !left.send(method, right) 
    end 
end 

def compose(statements) 
    correct = statements.detect do |s, v| 
    bool_parse(s) 
    end 
    correct && correct.last 
end 

compose({["if", "3", ">", "5"] => 1}) 
#=> nil 
compose({["if", "3", ">", "5"] => 1, ["elsif", "2", ">", "-1"] => 2}) 
#=> 2 
+1

這很酷 - 我會試試看。謝謝。 – sscirrus

+0

只需檢查 - 如果您是通過'op'指的是'operator',那肯定應該是==/運算符,而不是if/elsif? – sscirrus

+0

它是'操作'(只要它在你的數組中第一個),在我的符號 – fl00r