相关疑难解决方法(0)

836
推荐指数
4
解决办法
14万
查看次数

ruby中的静态变量

我刚学会了php中的静态变量.红宝石中有类似的东西吗?

例如,如果我们想要为我们创建的Student每个student对象创建一个类,它的id号应该自动增加.

我认为创建类变量作为静态会做.

ruby

68
推荐指数
2
解决办法
8万
查看次数

什么时候Ruby实例变量设置?

class Hello
@hello = "hello"
    def display
        puts @hello
    end
end

h = Hello.new
h.display
Run Code Online (Sandbox Code Playgroud)

我创建了上面的课程.它不打印任何东西.我认为在类声明期间设置了实例变量@hello.但是当我调用display方法时输出为'nil'.这样做的正确方法是什么?

ruby syntax instance-variables

65
推荐指数
5
解决办法
4万
查看次数

如何更正 RuboCop 中的“Style/ClassVars”?

我看到了在 Ruby 中使用类变量的问题;然而,似乎 RuboCop 的关于如何解决这个问题的文档是不够的。

现在,我可以忽略它。鉴于我的项目,没关系。但是,我只想知道 Rubocop 试图告诉我做什么,因为它没有意义。

在with 中执行提供的代码给出:irb 0.9.6Ruby 2.5.1

class A
  @test = 10
end
#=> 10
class A
  def test
    @@test # you can access class variable without offense
  end
end
#=> :test
A.new.test
Traceback (most recent call last):
        3: from /Users/Ricky/.rbenv/versions/2.5.1/bin/irb:11:in `<main>'
        2: from (irb):12
        1: from (irb):9:in `test'
NameError (uninitialized class variable @@test in A)
Did you mean?  @test
Run Code Online (Sandbox Code Playgroud)

所以不行。我们显然不能在没有冒犯的情况下访问类变量。irb非常生气。但是,ruby 建议使用@test. 也许这只是一个错字?让我们试试看: …

ruby rubocop

12
推荐指数
2
解决办法
3463
查看次数

为什么在Ruby中使用类变量被认为是"代码味道"?

根据Reek的说法,创建一个类变量被认为是"代码味道".这背后的解释是什么?

ruby class-variables class-instance-variables

9
推荐指数
1
解决办法
2088
查看次数

属于类对象的"@"实例变量和Ruby中的"@@"类变量之间的区别?

根据wikibooks ...

  • @one下面 属于类对象的实例变量(注意这与类变量不同,不能被称为@@one)
  • @@value一个类变量(类似于Java或C++中的static).
  • @two 属于 MyClass 实例的实例变量.

我的问题:

@one和@@值之间有什么区别?
另外,有没有理由使用@one?

class MyClass
  @one = 1
  @@value = 1

  def initialize()
    @two = 2
  end
end
Run Code Online (Sandbox Code Playgroud)

ruby

5
推荐指数
1
解决办法
553
查看次数

从模块设置类变量

我希望我的应用程序有单独的日志。我创建了以下模块:

module MyApp
  module MyLog
    def self.included(base)
      base.extend(ClassMethods)
    end

    module ClassMethods
      def logger
        @@logger ||= Logger.new("#{Rails.root}/log/#{self.name.underscore}.log")
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

然后,在我的任何模型中,我可以添加:

include MyApp::MyLog
Run Code Online (Sandbox Code Playgroud)

并将其用作(日志文件将出现在.../log/cat.log):

Cat.logger.info 'test'
Run Code Online (Sandbox Code Playgroud)

我尝试在和模型included上使用此方法,得到以下结果:CatDog

Cat.new.logger
# => #<Logger:0x007fe4516cf0b0 @progname=nil, ... @dev=#<File:/.../log/cat.log>, ... 
Dog.new.logger
# => #<Logger:0x007fe4516cf0b0 @progname=nil, ... @dev=#<File:/.../log/cat.log>, ... (the same)
Run Code Online (Sandbox Code Playgroud)

如果我尝试首先使用我的记录器进行Dog模型,我将有一个名为dog( /dog.log) 的日志文件。

如何使用@@logger正确的初始化记录器为每个类设置模块中的类变量?

ruby logging ruby-on-rails

5
推荐指数
1
解决办法
2067
查看次数

Ruby 类变量的 Getter/Setter

可以为使用attr_accessor以下方法为实例变量生成的类变量自动生成/启用 getter/setter :

class School
  @@syllabus = :cbse

  def self.syllabus
    @@syllabus
  end

  def self.syllabus=(_)
    @@syllabus = _
  end
end

School.syllabus = :icse
School.syllabus # => :icse
Run Code Online (Sandbox Code Playgroud)

ruby

4
推荐指数
1
解决办法
2823
查看次数

ruby:类实例变量vs实例变量

我的想法是为那些来自java背景的人创建一个社区wiki,因为阅读了大量的解释,直到我真正尝试了几件事情并且拼图的各个部分开始找到他们的位置时,我无法理解任何事情.但我首先需要确保我做对了.从这样的背景来看,我发现这@variable可能意味着两件截然不同的事情让我非常困惑.这是一个例子:

class Test
  @ins = "gah"
  def self.ins
    puts @ins
  end

  def initialize()
    @ins = "wtf?"
  end
  def ins2
    puts @ins
  end
end
Run Code Online (Sandbox Code Playgroud)

据我所知,第一个@ins是表示类的对象的实例变量Test.第二个@ins是类对象中的实例变量Test.

现在事情开始对我有意义了.这里有几个例子:

[14] pry(main)> test.ins2
wtf?
Run Code Online (Sandbox Code Playgroud)

我们正在调用一个对象的方法,它返回对象的实例变量.

[15] pry(main)> test.ins
NoMethodError: undefined method `ins' for #<Test:0x000000017d9348 @ins="wtf?">
Run Code Online (Sandbox Code Playgroud)

我们试图通过一个对象调用一个类方法,这个方法属于类,所以我们得到了 NoMethodError

[16] pry(main)> Test.ins
gah
Run Code Online (Sandbox Code Playgroud)

我们正在调用一个类方法,因此它可以正确地看到类对象的实例变量.

[17] pry(main)> Test.ins2
NoMethodError: undefined method `ins2' for Test:Class
Run Code Online (Sandbox Code Playgroud)

我们通过类调用一个对象方法,这是不正确的抛出NoMethodError.

以上所有都是用ruby 2.0进行的.那我在问什么?

  • 我做对了吗?
  • 我的红宝石术语是否正确?
  • 在正确设计的应用程序中有意义的类实例变量的任何实际用法?或者这些只是更好的@@类变量?

ruby instance-variables class-instance-variables

3
推荐指数
2
解决办法
1908
查看次数

在加载时(不是在初始化时)在类中的包含模块中执行代码

我正在做一个项目,其中多个类将包括MyModule. 在包含模块后,我希望包含模块的类将类类型的句柄推送到特定的类级数组。

我在下面尝试过的伪代码没有达到我想要的效果:

class Poly
  @@tracking = []
end

module MyModule
  def initialize(klass)
    Poly.tracking << self # Where `self` is the class, e.g. `MyClass1`, not an instance of the class.
  end
end

class MyClass1
  include MyModule
end

class MyClass2
  include MyModule
end
Run Code Online (Sandbox Code Playgroud)

加载后,我希望Poly.tracking等于[MyClass1, MyClass2].

ruby

3
推荐指数
1
解决办法
1916
查看次数

Ruby:未定义的局部变量或Class的方法

我在控制器中有一个非常简单的方法:

class ReportsController < ApplicationController

  client = MWS.reports

  def request_all_listings
    begin
      parser = client.request_report('_GET_FLAT_FILE_OPEN_LISTINGS_DATA_', opts = {})
      @result = parser.parse["ReportRequestInfo"]["ReportProcessingStatus"]

      puts @result

    rescue Excon::Errors::ServiceUnavailable => e
      logger.warn e.response.message
      retry
    end
  end

  request_all_listings

end
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

 undefined local variable or method `request_all_listings' for ReportsController:Class
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?当我删除def request_all_listingsdef和end行并且只有begin/rescue/end我的代码工作正常...

ruby

3
推荐指数
1
解决办法
4508
查看次数