class MyClass
  def mymethod
    MYCONSTANT = "blah"
  end
end
给我错误:
SyntaxError:动态常量赋值错误
为什么这被视为动态常数?我只是给它分配一个字符串.
Phr*_*ogz 130
您的问题是,每次运行该方法时,您都要为常量赋值.这是不允许的,因为它使常数不恒定; 即使字符串的内容相同(暂时,无论如何),每次调用方法时,实际的字符串对象本身都是不同的.例如:
def foo
  p "bar".object_id
end
foo #=> 15779172
foo #=> 15779112
也许如果您解释了您的用例 - 为什么要在方法中更改常量的值 - 我们可以帮助您实现更好的实现.
也许你宁愿在课堂上有一个实例变量?
class MyClass
  class << self
    attr_accessor :my_constant
  end
  def my_method
    self.class.my_constant = "blah"
  end
end
p MyClass.my_constant #=> nil
MyClass.new.my_method
p MyClass.my_constant #=> "blah"
如果你真的想要在方法中更改常量的值,并且你的常量是一个String或一个数组,你可以"欺骗"并使用该#replace方法使对象获取一个新值而不实际更改对象:
class MyClass
  BAR = "blah"
  def cheat(new_bar)
    BAR.replace new_bar
  end
end
p MyClass::BAR           #=> "blah"
MyClass.new.cheat "whee"
p MyClass::BAR           #=> "whee"
Aje*_*i32 66
因为Ruby中的常量并不是要改变,所以Ruby不鼓励你在可能多次执行的代码部分中分配给它们,比如内部方法.
在正常情况下,您应该在类本身内部定义常量:
class MyClass
  MY_CONSTANT = "foo"
end
MyClass::MY_CONSTANT #=> "foo"
如果由于某种原因你确实需要在方法中定义一个常量(也许是某种类型的元编程),你可以使用const_set:
class MyClass
  def my_method
    self.class.const_set(:MY_CONSTANT, "foo")
  end
end
MyClass::MY_CONSTANT
#=> NameError: uninitialized constant MyClass::MY_CONSTANT
MyClass.new.my_method
MyClass::MY_CONSTANT #=> "foo"
但是,const_set在正常情况下,你不应该真正采取行动.如果您不确定是否确实希望以这种方式分配常量,则可能需要考虑以下其中一种选择:
类变量在很多方面表现得像常量.它们是类的属性,可以在定义它们的类的子类中访问它们.
不同之处在于类变量是可修改的,因此可以在没有问题的情况下分配给内部方法.
class MyClass
  def self.my_class_variable
    @@my_class_variable
  end
  def my_method
    @@my_class_variable = "foo"
  end
end
class SubClass < MyClass
end
MyClass.my_class_variable
#=> NameError: uninitialized class variable @@my_class_variable in MyClass
SubClass.my_class_variable
#=> NameError: uninitialized class variable @@my_class_variable in MyClass
MyClass.new.my_method
MyClass.my_class_variable #=> "foo"
SubClass.my_class_variable #=> "foo"
类属性是一种"类上的实例变量".它们的行为有点像类变量,除了它们的值不与子类共享.
class MyClass
  class << self
    attr_accessor :my_class_attribute
  end
  def my_method
    self.class.my_class_attribute = "blah"
  end
end
class SubClass < MyClass
end
MyClass.my_class_attribute #=> nil
SubClass.my_class_attribute #=> nil
MyClass.new.my_method
MyClass.my_class_attribute #=> "blah"
SubClass.my_class_attribute #=> nil
SubClass.new.my_method
SubClass.my_class_attribute #=> "blah"
为了完整起见,我应该提一下:如果你需要分配一个只能在你的类实例化之后才能确定的值,那么你很可能实际上正在寻找一个普通的旧实例变量.
class MyClass
  attr_accessor :instance_variable
  def my_method
    @instance_variable = "blah"
  end
end
my_object = MyClass.new
my_object.instance_variable #=> nil
my_object.my_method
my_object.instance_variable #=> "blah"
MyClass.new.instance_variable #=> nil
Dav*_*son 30
在Ruby中,名称以大写字母开头的任何变量都是常量,您只能分配一次.选择以下替代方案之一:
class MyClass
  MYCONSTANT = "blah"
  def mymethod
    MYCONSTANT
  end
end
class MyClass
  def mymethod
    my_constant = "blah"
  end
end
| 归档时间: | 
 | 
| 查看次数: | 100958 次 | 
| 最近记录: |