Ruby如何从另一个方法修改实例变量?

时间:2017-03-26 07:07:22

标签: ruby

基本上,每次调用方法variable_position时,我需要增加一个变量set_variable_value,因此通过该方法创建的每个bin_val变量都会使用不同的增量创建variable_position require "./my_math.rb" class Rules attr_accessor :variable_position JUMP_ARR = [";JGT", ";JEQ", ";JGE", ";JLT", ";JNE", ";JLE", ";JMP"] def initialize @variable_position = 15 end # A instructions have to be 16 bit long def self.a_16_bit (line) a_rules = Rules.new if line[1] == 'R' bin_val = a_rules.set_reserved_variable_value(line) elsif (/^[[:alpha:]]+$/).match(line[1..line.length]) bin_val = a_rules.set_variable_value #HERE IS WHERE I CALL THE METHOD else bin_val = MyMath.to_binary(line[1..line.length]) end n = bin_val.to_s.length m = 16 - n complete_number = ("0"*m) + bin_val.to_s end def set_variable_value @variable_position += 1 #HERE IS WHERE I TRY TO INCREASE THE VALUE bin_val = MyMath.to_binary(@variable_position) end end 1}}参数从16开始。

正确地知道,它在第一次方法调用中从15(参见initialize方法)变为16,但无论方法被调用多少次,我都会保持在16位。

SalesForm frmSales = Application.OpenForms.OfType<SalesForm>().SingleOrDefault();
frmSales.txtSUMMARY.Text = dateTimePicker1.Value.ToLongDateString();
frmSales.Show();
this.Close();

非常感谢阅读。

2 个答案:

答案 0 :(得分:3)

当您致电a_rules = Rules.new时,您正在创建一个新的规则实例。因此,构造函数initialize正在为每个实例将@variable_position值设置为15。

然后,当您调用方法bin_val = a_rules.set_variable_value时,它会增加@variable_position的值一次,因为您仍然在处理同一个实例。

我建议@variable_position应该是一个类变量。这样,每次实例化新对象时,您都不会重置它的值。

答案 1 :(得分:1)

您根本不需要该对象的实例:

require "./my_math.rb"
class Rules
  JUMP_ARR = [";JGT", ";JEQ", ";JGE", ";JLT", ";JNE", ";JLE", ";JMP"]

  @variable_position = 15

  # A instructions have to be 16 bit long
  def self.a_16_bit (line)
    bin_val = if line[1] == 'R'
                # code from set_reserved_variable_value(line) here
              elsif (/^[[:alpha:]]+$/).match(line[1..line.length])
                MyMath.to_binary(@variable_position += 1)
              else
                MyMath.to_binary(line[1..line.length])
              end
    n = bin_val.to_s.length
    m = 16 - n
    complete_number = ("0"*m) + bin_val.to_s
  end
end

在当前的代码中,您正在搞乱实例变量和类方法。