以下是一个例子:
@current_day = 0
@current_time = 100
def calc_day(amount, type = :add)
calc_with = type == :add ? "+" : "-"
@current_day = eval("#{@current_day} #{calc_with} (( #{@current_time} #{calc_with} #{amount}) / 1440)")
end
calc_day(:add, 2440)
p @current_day
你也可以用这种方式编写方法:
def calc_day(amount, type = :add)
if type == :add
@current_day = @current_day + ((@current_time + amount) % 1440)
else
@current_day = @current_day - ((@current_time - amount) % 1440)
end
end
我的问题是,如果有方法不使用eval,但也不必用+和 - 符号写两次整个表达式是唯一的区别。
答案 0 :(得分:4)
你可以尝试这样:
def calc_day(amount, type = :add)
method_names = {add: :+, subtract: :-}
method = method_names[type] || raise 'Unknown calculation type'
@current_day = @current_day.send(method, (@current_time.send(method, amount) % 1440)
end
答案 1 :(得分:3)
使用send
在计算中动态使用+
或-
:
def calc_day(amount, type = :add)
calc_with = type == :add ? "+" : "-"
@current_day = @current_day.send(calc_with, @current_time.send(calc_with, amount) % 1440)
end
答案 2 :(得分:2)
您可以尝试乘以-1 ...
def calc_day(amount, type = :add)
type_op = (type == :add) ? 1 : -1
@current_day = @current_day + (type_op)*((@current_time + (type_op*amount)) % 1440)
end