Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby类级字符串管理,变量vs方法_Ruby_String_Class - Fatal编程技术网

Ruby类级字符串管理,变量vs方法

Ruby类级字符串管理,变量vs方法,ruby,string,class,Ruby,String,Class,我在以下方面看到了许多不同的偏好: class Foo VAR = "Some string".freeze # or def self.var "Some String" end end 两者都可以通过相同的方式访问: Foo::VAR #=> "Some String" Foo::var #=> "Some String" 但是如果它是一个方法,您也可以执行Foo.var来获得相同的字符串。将它定义为一个变量感觉就像打破了OO赋予我们的封装能

我在以下方面看到了许多不同的偏好:

class Foo
  VAR = "Some string".freeze

  # or 

  def self.var
    "Some String"
  end
end
两者都可以通过相同的方式访问:

Foo::VAR 
#=> "Some String"

Foo::var
#=> "Some String"
但是如果它是一个方法,您也可以执行
Foo.var
来获得相同的字符串。将它定义为一个变量感觉就像打破了OO赋予我们的封装能力。然而,我看到很多字符串/幻数存储在类的变量中,这似乎是一种更常见的做法

我不确定哪个是对的

编辑
对不起,我的问题有点困惑。我想知道在方法中存储字符串是否比在类的变量中存储字符串更好。我在解释如何调用这些方法时把问题弄糊涂了

首先,使用常量将保证子类不仅使用相同的字符串,而且使用相同的对象

  class Bar < Foo; end
  Foo::VAR.object_id == Bar::VAR.object_id # => true
class-Bartrue
第二,用
::
语法调用类方法非常混乱,惯例是使用
(请参阅)


因此,基于您的问题,我将提倡持续使用,将
不可变字符串
存储在
常量
中更有意义。存储在
常量中
用于基本目的,即
词法范围内所有人都可以使用的常量


就个人而言,在方法中存储
“某些字符串”
是浪费资源,因为每次调用
self.var
时,我们都会再次初始化接收者的字符串,这在这种情况下并不理想。我这样说是因为Ruby
Scope Gate
扮演着巨大的角色,由于它的动态特性,每次访问
类及其
方法时,您都进入了一个新的范围。还有一个类似的问题被问到。

VAR
是一个常数
var
是一种类方法。类方法可以用任何语法(双冒号和点)调用。一切正常。我投票结束这个问题。使用
Foo.var
而不是
Foo::var
更为惯用。如中所述:“您也可以使用
::
指定接收者,但这很少使用,因为可能会与命名空间的
混淆。”很抱歉,问题不是哪一个更好,而是将字符串存储在变量和方法中。答案是:将其存储在您觉得更有趣的任何地方。“将其定义为变量[…]”–您不会将其定义为变量
@@var
将是一个变量,
var
是一个常量。
class Foo;def self.var;“str”,冷冻;终止终止类Bar
还保证两者使用相同的对象。我看不出你的回答有什么道理。约定只是约定,你喜欢这样,我喜欢这样,它太基于观点(而且有偏见),不应该作为答案提升。实际上,使用类方法返回的冻结值,对象id对于子类是相同的。(那么问题应该修改)。顺便说一句,你有一个打字错误,我想你的意思是“str”。冻结
谢谢你的见解,这就是我要找的!