在Java中,我们通常会创建一个StringPool.class
来存储经常使用的String
。例如:我们声明
public static final String SPACE = " ";
,并在需要时调用StringPool.SPACE
。
在Ruby中执行此操作是否也是一种好习惯?如果是,你能举一个Ruby中StringPool
的例子吗?
答案 0 :(得分:1)
如果您打算在特定上下文中的分组 ruby中的一组常量,您可以使用类或模块来执行此操作:
class MyConstants
CONST_1 = "Constant1"
CONST_2 = "Constant2"
# ...
end
或
module MyConstants
CONST_1 = "Constant1"
CONST_2 = "Constant2"
end
然后您可以通过以下方式访问这些常量:
MyConstants::CONST
请注意,常量值可以是除字符串之外的任何值,甚至是符号。如前面在其他答案中提到的,使用符号在ruby中是常见的习惯用法。但是,当您想明确表示您的常量属于某个特定上下文(即像枚举)时,这种模式是有意义的。这使IMHO强制执行您的应用程序的语义。
答案 1 :(得分:0)
您的答案已由 Ari 在评论中提供,但我会在此处复制以帮助其他人快速找到答案。
你需要一个符号。
Symbol是不可变的,快速比较字符串。
您可以通过以下方式定义其实例:
:foo # => :foo <- it's a symbol
"string".to_sym # => :string <- symbol too. But prefer a first way
# due to avoid string object creation.
事实并非如此。即使您的symbol-table
和:foo
,所有符号都存储在特殊:string
中。您可以查看符号表:
Symbol.all_symbols #=> [:execute_script, :array_new_range, :ExtendCommand, ...]
这张桌子看起来真的很大。如果你想在其中找到符号怎么办?
Symbol.all_symbols.index(:foobar42) # => bad. It will find index of symbol
# :foobar42 but it will create it first
# if it wasn't.
Symbol.all_symbols.index(/foobar42/) # returns nil if there's no such a symbol
这些符号可以快速比较,因为它们是不可变的。方法==
只检查object_ids是否相同。
我很确定你知道。当你想要多次使用一个字符串而不打算改变它时。
就是这样。
我在阅读你的问题后首先想到的是:嘿,为什么他们需要字符串池?我认为字符串在java中是不可变的。这就是为什么我们必须使用字符串构建器和其他东西。但后来我看到public static final String
。哦是的,它是 java 。