根据方法参数减去或添加,eval alternate

时间:2014-04-07 12:15:35

标签: ruby eval add

以下是一个例子:

@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,但也不必用+和 - 符号写两次整个表达式是唯一的区别。

3 个答案:

答案 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