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

时间:2015-04-15 19:16:23

标签: 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 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)

所以我只是想知道如何将second_method合并到第一个。

它只在我做的时候起作用:

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

3 个答案:

答案 0 :(得分:0)

您已将second_method定义为MyClass上的实例方法,这意味着它只能在MyClass的实例上调用 - 而不是在类本身上调用(这就是为什么第二个版本有效,您可以使用self.运算符将两个方法定义为类方法。

要让现有代码生效,您可以在MyClass.new.second_method(variable)内拨打self.create_array

答案 1 :(得分:0)

在Ruby中,只能从类方法调用类方法。当你在第一个片段中调用create_array时,你无法从里面调用一个实例。

答案 2 :(得分:0)

与其他人指出的一样,类方法只能直接在类本身上调用。

这是你想要实现的吗?

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"]>