我有一个我一直在努力的插件,它将发布添加到ActiveRecord类.我和我的发布者一起扩展我的课程:
class Note < ActiveRecord::Base
# ...
publishable :related_attributes => [:taggings]
end
Run Code Online (Sandbox Code Playgroud)
我的发布商的结构如下:
module Publisher
def self.included(base)
base.send(:extend, ClassMethods)
@@publishing_options = [] # does not seem to be available
end
module ClassMethods
def publishable options={}
include InstanceMethods
@@publishing_options = options
# does not work as class_variable_set is a private method
# self.class_variable_set(:@@publishing_options, options)
# results in: uninitialized class variable @@publishing_options in Publisher::ClassMethods
puts "@@publishing_options: #{@@publishing_options.inspect}"
# ...
end
# ...
end
module InstanceMethods
# results in: uninitialized class variable @@publishing_options …Run Code Online (Sandbox Code Playgroud) 在我当前的项目中,我有一个类,它将Instance存储在一个变量中.该实例应该可以被项目中的所有其他类访问,但它只能由其自己的类更改.
我怎样才能做到这一点?
如下面的代码所示,在超类中定义类访问器可能会有意外行为,因为类访问器对于所有子类都是相同的变量.
class Super
cattr_accessor :name
end
class SubA < Super; end
class SubB < Super; end
SubA.name = "A"
SubB.name = "B"
SubA.name
=> "B" # unexpected!
Run Code Online (Sandbox Code Playgroud)
我希望每个子类都有一个独立的类访问器,因此可能的解决方案是将cattr_accessor从超类中移出并将其放在每个子类中.
class Super; end
class SubA < Super
cattr_accessor :name
end
class SubB < Super
cattr_accessor :name
end
SubA.name = "A"
SubB.name = "B"
SubA.name
=> "A" # expected!
Run Code Online (Sandbox Code Playgroud)
这个解决方案是一个很好的做法吗?你知道更好的选择吗?
我想用 C++ 创建某种事件系统来满足我的需要
我知道你可以使用函数作为其他函数参数
可能我错过了一些东西(但在 C# 中你可以使用事件处理程序来做到这一点)
我很难理解实例变量,类变量以及它们之间在ruby中的区别......有人可以向我解释它们吗?我已经完成了大量的谷歌搜索,完全无法理解它们.
谢谢!
静态/类变量在类型/类中定义,并且被称为与其定义的类型/类相关联,并且独立于类型/类的实例.类型/类中只有一个静态/类变量,最好用于常量like属性,其值在类的任何实例中都很常见.静态/类变量的状态始终存在于类中,因此在类中的任何时刻只有一个变量,而关键字static用于定义变量的这种性质.最佳实践中的static/class变量将初始化一次,并使用关键字final确保.最终的静态变量将使用不可变的集合进行初始化,如新的String()或new Integer();
现在我的问题是静态变量的值是如何使用的?这个变量的用途是什么?例如,它是从包含它的类中复制它的值还是它是对类中变量的显式引用?
例如
class GenericType {
private final static String commonValue = new String("foobar");
}
class AnotherGenericType {
public static void main(String[] args) {
System.out.println(GenericType.commonValue); //Displays foobar in the console.
}
}
Run Code Online (Sandbox Code Playgroud) 考虑Python 3中的以下类:
class Foo(AnotherClass):
id_counter = 0
def __init__(self):
super().__init__()
self.id = Foo.id_counter
Foo.id_counter += 1
Run Code Online (Sandbox Code Playgroud)
是否有一个关键字(super在本例中类似于Python )可用于访问类变量而不是放置类名Foo?
我已经读过Is Rails无共享或者可以单独请求访问相同的运行时变量吗?他们解释我的问题:
类变量可能在我的rails srver的两个请求之间共享,但解决方案在哪里!?
如何在请求之间实现安全单例?
class Foo
@@instances = []
end
Run Code Online (Sandbox Code Playgroud)
我怎样才能确定每个请求HTTP都会重置实例?!
编辑:
我发现"config.reload_classes_only_on_change = false"解决方案,但我不确定它是最好的性能.
这个选项有什么后果?
我有一个例子来测试安全类变量:
class Test
def self.log
@test ||= false
puts @test
@test = true
end
end
class ApplicationController < ActionController::Base
def index
Test.log
Test.log
end
end
Run Code Online (Sandbox Code Playgroud)
如果我通过重新加载动作(F5)启动此代码,我希望每次在rails服务器的日志中读取"false".但是,默认情况下它只是第一次"假".
编辑2:实际上这个选项重装类,但没有解决线程中的concurency问题.类变量被重置,但它们可以被其他线程修改.
线程安全类变量如何?
singleton static-variables thread-safety class-variables ruby-on-rails-4
我希望我的类有一个基于类变量的字符串表示(在派生类中可能有所不同).这个答案表明,元类可能是要走的路:
class MC(type):
def __repr__(self):
return 'Wahaha!'
class C():
__metaclass__ = MC
print(C)
Run Code Online (Sandbox Code Playgroud)
但这在Python 3中不起作用,返回
<class '__main__.C'>
Run Code Online (Sandbox Code Playgroud)
而不是Wahaha!.有人可以向我解释Python 2和3之间的变化以及如何在Python 3中进行更改吗?
我在 Python 中使用 SQLAlchemy 并声明我的类继承自声明性基础,如下所示:
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class SomeClass(Base):
__tablename__ = 'some_table'
id = Column(Integer, primary_key=True)
name = Column(String(50))
Run Code Online (Sandbox Code Playgroud)
作为用户,我想将 定义__tablename__为参数,而不是硬编码的 value ,如下所示:
class SomeClass(Base):
__tablename__ = f'{environment}_some_table'
id = Column(Integer, primary_key=True)
name = Column(String(50))
Run Code Online (Sandbox Code Playgroud)
我的理解是,f'{environment}_some_table'当我导入这个包时将对其进行评估,因此我将无法在稍后阶段(即在交互式笔记本中)修改它。我有一段损坏的代码试图通过嵌套类和封装来解决这个问题,但我没有设法引用外部类的实例变量。
class Outer:
def __init__(self, env):
self.environment = env
class SomeClass(Base):
__tablename__ = f'{self.environment}_some_table'
id = Column(Integer, primary_key=True)
name = Column(String(50))
Run Code Online (Sandbox Code Playgroud)
我读过几个 SO 问题,最好不要使用嵌套类,因为这些类之间没有建立特殊关系。那么我应该使用什么样的设计来解决这个问题呢?
提前致谢!
class-variables ×10
python ×3
ruby ×3
class ×2
java ×2
python-3.x ×2
c++ ×1
inheritance ×1
keyword ×1
nested ×1
runtime ×1
singleton ×1
sqlalchemy ×1
variables ×1