【问题标题】:remember previous input value in ruby记住 ruby​​ 中的先前输入值
【发布时间】:2016-10-24 15:05:31
【问题描述】:

我在下面有这个示例类。

class MyClass
  def initialize(options = {})
    @input = options[:input]
  end

  def trigger
    # I want to remember previous input value if this method called.
    input
  end
end

如何存储或记住之前输入的值?例如。

my_class = MyClass.new(input: "first")
my_class.trigger
=> first

如果我打电话:

my_class.input = "second"

我想记住之前输入的值 "fisrt"。我怎样才能做到这一点?

【问题讨论】:

  • 由于您添加了rails作为标签,您可以包含ActiveModel::Dirty,它会记住对象在更改之前和之后的先前状态。
  • 谢谢! @bkunzi01。这也很有用。

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2


【解决方案1】:

您需要另一个实例变量来保存在您调用方法触发器时分配给input 变量的值。

class MyClass
  attr_writer :input

  def initialize(options = {})
    @input = options[:input]
  end

  def trigger
    @triggered_input = @input
  end

  def input
    @triggered_input
  end
end

my_class = MyClass.new(input: 'first')
my_class.input #=> nil
my_class.trigger #=> 'first'

my_class.input = 'second'
my_class.input #=> 'first'
my_class.trigger #=> 'second'
my_class.input #=> 'second'

【讨论】:

  • 为什么不使用attr_accessor 并同时获取读取器和写入器方法?
  • 在这种情况下你不能使用attr_accessor :input,因为你想在getter方法中返回其他值。
  • 啊,如果是这样,那么你是对的。这个设计令人困惑,但问题就是这样。
【解决方案2】:

您应该做的是创建@input as 和数组并对其进行迭代以显示所有结果。

class MyClass
  attr_accessor :input

  def initialize(options = {})
    @input = []
    @input << options[:input]
  end

  def input=(item)
    @input.unshift(item)
  end

  def trigger
    # I want to remember previous input value if this method called.
    @input.first
  end
end

my_class = MyClass.new(input: 'first')
my_class.input = "second"

my_class.input.each {|i| puts i}

【讨论】:

  • 您可能想要执行@input.unshift(options[:input]),然后将trigger 定义为@input[1],如果有的话,这将始终是之前的值。
  • 谢谢! @CdotStrifeVII。这是有效的,但我已经接受了上面的答案,所以我只会赞成你的答案。
  • 是的,我认为这是可逆的;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
相关资源
最近更新 更多