Ruby 红宝石类与实例变量方法

Ruby 红宝石类与实例变量方法,ruby,class,methods,Ruby,Class,Methods,我有一门课: class MyClass def self.create_array variable = ['one', 'two', 'three'] # I had: # variable.each {|v| v.upcase} # but want to do: second_method(variable) # or like this: variable.second_method # of course wit

我有一门课:

class MyClass
  def self.create_array
    variable = ['one', 'two', 'three']

    # I had:
    # variable.each {|v| v.upcase}
    # but want to do:

    second_method(variable)
    # or like this:
    variable.second_method
    # of course without parameter 'var' in second option
  end

  def second_method (var)
    var.map {|v| v.upcase}
  end
end


puts MyClass.create_array
# of course:
=> undefined method `second_method' for MyClass:Class (NoMethodError)
所以我只是想知道如何将第二种方法合并到第一种方法中

只有当我这样做时,它才起作用:

class MyClass
  def self.create_array
    variable = ['one', 'two', 'three']

    MyClass.second_method(variable)
  end

  def self.second_method (var)
    var.map {|v| v.upcase}
  end
end


puts MyClass.create_array
为什么只有在我上课的时候才能用?我只想在我的变量上调用它。请,开导我吧

编辑 在以下情况下创建方法是否有意义:

class Array
  def second_method
    #content
  end
end
您已经在MyClass上将second_方法定义为实例方法,这意味着只能在MyClass的实例上调用它,而不能在类本身上调用它。这就是为什么第二个版本可以工作的原因,在第二个版本中,您使用self将两个方法定义为类方法。接线员


要使现有代码正常工作,可以在self.create\u数组中调用MyClass.new.second\u methodvariable。

在Ruby中,只能从类方法调用类方法。在第一个代码段中调用create_array时,不能从内部调用实例methds。

正如其他人指出的,类方法只能直接在类本身上调用

这是你想要实现的吗

class MyClass
  attr_accessor :variable

  def initialize
    @variable = ['one', 'two', 'three']
    second_method @variable
  end

  def second_method var
    @variable = var.map {|v| v.upcase}
  end
end


MyClass.new

#<MyClass:0x292fda0 @variable=["ONE", "TWO", "THREE"]>
或者,在像这样实例化类时,可以将数组作为参数

class MyClass
  attr_accessor :variable

  def initialize variable
    @variable = variable
    second_method @variable
  end

  def second_method var
    @variable = var.map {|v| v.upcase}
  end
end


MyClass.new ['one', 'two', 'three']

#<MyClass:0x292fda0 @variable=["ONE", "TWO", "THREE"]>

第二个方法不能在类方法内部调用,因为它缺少实例。类的方法总是需要类的实例,否则不能调用它。读一读,这不会对类数组进行monkeypatching,在包含非字符串的数组上调用时会出现错误,这也是类中需要的功能,而不是在array@peter所以我会按照你下面的建议去做,谢谢!这看起来像是我想要实现的目标。但我不确定是否可以初始化数组。需要在我的代码上测试它。谢谢您的提示。您可以在实例化类时将数组作为参数,并在回答中补充说,还忘了将第二个_方法的结果存储到@variableMy code有点复杂。。我需要一段时间来测试它。同时,若你们能看看我在编辑部分的问题就好了=