Ruby中字符串池的良好实践

时间:2013-11-21 01:50:33

标签: java ruby string

在Java中,我们通常会创建一个StringPool.class来存储经常使用的String。例如:我们声明

public static final String SPACE = " ";,并在需要时调用StringPool.SPACE

在Ruby中执行此操作是否也是一种好习惯?如果是,你能举一个Ruby中StringPool的例子吗?

2 个答案:

答案 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