【问题标题】:Ruby. Class vs instance variable methods红宝石。类与实例变量方法
【发布时间】:2015-04-15 19:16:23
【问题描述】:

我有一堂课:

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

【问题讨论】:

  • second_method 不能在类方法中调用,因为它缺少实例。类的方法总是需要类的实例,否则不能调用。另请阅读railstips.org/blog/archives/2009/05/11/…
  • 不会对类数组进行猴子补丁,当在包含非字符串的数组上调用时会出错,这也是你的类中需要的功能,而不是数组中
  • @peter 所以我会在下面听从你的建议,谢谢!

标签: ruby class methods


【解决方案1】:

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

要让您现有的代码正常工作,您可以在 self.create_array 中调用 MyClass.new.second_method(variable)

【讨论】:

    【解决方案2】:

    在 Ruby 中,只能从类方法调用类方法。当您在第一个 sn-p 中调用 create_array 时,您不能从其中调用实例方法。

    【讨论】:

      【解决方案3】:

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

      这是你想要达到的吗?

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

      【讨论】:

      • 这看起来像是我想要实现的目标。但我不确定我是否可以初始化我的数组。需要在我的代码上进行测试。谢谢你的提示。
      • 您可以在实例化类时将数组作为参数,在答案中补充说,也忘记将 second_method 的结果存储到@variable
      • 我的代码有点复杂。我需要一段时间来测试它。同时,如果您可以在编辑部分查看我的问题,那就太好了=)
      猜你喜欢
      • 2017-04-01
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多