是什么class << self在Ruby中做什么?
我刚学会了php中的静态变量.红宝石中有类似的东西吗?
例如,如果我们想要为我们创建的Student每个student对象创建一个类,它的id号应该自动增加.
我认为创建类变量作为静态会做.
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 中使用类变量的问题;然而,似乎 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. 也许这只是一个错字?让我们试试看: …
根据Reek的说法,创建一个类变量被认为是"代码味道".这背后的解释是什么?
根据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) 我希望我的应用程序有单独的日志。我创建了以下模块:
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正确的初始化记录器为每个类设置模块中的类变量?
可以为使用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) 我的想法是为那些来自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进行的.那我在问什么?
我正在做一个项目,其中多个类将包括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].
我在控制器中有一个非常简单的方法:
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我的代码工作正常...