【问题标题】:Can't access class variable in ruby/rails?无法访问 ruby​​/rails 中的类变量?
【发布时间】:2013-12-31 19:59:23
【问题描述】:

我有这样的课:

Railsapp/lib/five9_providers/record_provider.rb:

class Five9Providers::RecordProvider < Five9Providers::BaseProvider

  def add_record_to_list
    variable = 'test'
  end

end

然后,在控制器中我有这个:

Railsapp/app/controllers/five9_controller.rb:

class Five9Controller < ApplicationController

    def import
      record_provider = Five9Providers::RecordProvider.new()
      record_provider.add_record_to_list
      puts Five9Providers::RecordProvider::variable
    end

end

但是,调用我的控制器方法 import 只会返回:

NoMethodError (undefined method 'variable' for Five9Providers::RecordProvider:Class)

如何从five9_controller.rb 类中的recover_provider.rb 类访问variable

编辑:

即使在我的record_providerfive9_controller 中都使用@@variable,我仍然无法访问该变量。我这样称呼它:puts @@variable.

【问题讨论】:

  • 这是非常基本的 Ruby 东西。在构建自学 Rails 应用程序之前,我至少会尝试学习 Ruby。
  • 完整性检查:“recover_provider.rb”和“five9_controller.rb”不是类。它们是文件,恰好包含类定义。小心你如何称呼事物,因为使用错误的术语会阻碍你被他人理解的能力。
  • 谢谢@theTinMan。尽可能多地吸收知识。

标签: ruby-on-rails ruby class inheritance


【解决方案1】:

正如所写,你不能。 variable 是实例方法的本地,不能被任何 Ruby 表达式从方法外部访问。

在相关点上,术语“类变量”通常用于指代@@variable 形式的变量。

更新:响应您的“编辑”声明,如果您在班级中将 variable 更改为 @@variable,则可以使用一些技术从班级外部访问该变量,但是对@@variable 的赤裸裸引用不是其中之一。请仔细阅读the question you cited in your comment 的答案以获取更多信息。

【讨论】:

  • 您能推荐一个替代方案吗?我遵循此处列出的结构:stackoverflow.com/questions/12590723/… 我可以做些什么来访问variable
  • @Luigi,您需要研究 Ruby 如何处理变量约定和范围。 techotopia.com/index.php/Ruby_Variable_Scope。类变量将以@@ 开头。实例变量将以 @ 开头。
  • 感谢@mbratch 的提示。不过,关于使用常量而不是类变量的讨论是什么?类变量似乎弊大于利。不过,我一定会检查链接并继续学习,感谢您的帮助。
  • @Luigi,类变量是否会造成损害取决于您设计代码的程度。它们在需要时和正确使用时可用。 :) 您确实需要确定是否需要实例变量与类变量(很难用您的简短示例来说明)。常量也可以定义并从类中访问。关于使用类与实例与私有变量的优缺点以及 Ruby 如何处理它们的优缺点的讨论远远超出了您最初发布的问题的范围。
  • @mbratch 各方面都同意,我显然还有很多东西要学。我编辑了我的原始帖子以包含更多信息。
【解决方案2】:

最好的方法是使用方法设置和获取值。下面是一个示例代码

class Planet
  @@planets_count = 0

  def initialize(name)
    @name = name
    @@planets_count += 1
  end

  def self.planets_count
    @@planets_count
  end  

  def self.add_planet
    @@planets_count += 1
  end

  def add_planet_from_obj
    @@planets_count += 1
  end
end


Planet.new("uranus")
Plant.add_planet
obj = Planet.new("earth")
obj.add_planet_from_obj

【讨论】:

    猜你喜欢
    • 2016-09-22
    • 2014-12-03
    • 2014-06-04
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2015-12-07
    • 1970-01-01
    相关资源
    最近更新 更多