Ruby:定义具有默认值的类级哈希表

5

i have a basic ruby class:

class LogEntry

end

我想要做的是定义一个哈希表,并赋予一些值,如下所示:

EntryType = { :error => 0, :warning => 1, :info => 2 }

这样我就可以像这样访问值(或类似的东西):

LogEntry.EntryType[:error]

在 Ruby 中是否可能实现这一点?我正在正确的道路上吗?

4个回答

7
你可以这样做:
class LogEntry
    EntryType = { :error => 0, :warning => 1, :info => 2 }
end

但您希望将其作为引用

LogEntry::EntryType[:error]

1
虽然只有第一个字母是否大写才是重要的,但我认为在 Ruby 中使用 ENTRY_TYPE 而不是 EntryType 更符合惯用法。CamelCase 通常仅用于模块和类名。 - Grant Hutchins
1
另外,如果您不希望在原地修改哈希对象,则需要执行ENTRY_TYPE = { :error => 0, :warning => 1, :info => 2 }.freeze。 - Grant Hutchins

1

或者你可以创建一个类方法:

class LogEntry

  def self.types
    { :error => 0, :warning => 1, :info => 2 }
  end

end

# And a simple test
LogEntry.types[:error].should be_an_instance_of(Hash)

0

为什么需要哈希?

你不能只在LogEntry类上声明条目类型吗?

class LogEntry
  @@ErrorType = 0
End

LogEntry.ErrorType

0
我很好奇为什么你不能在LogEntry实例上将@error_type设置为实例变量?
class LogEntry
  attr_reader :type
  ERROR_RANKING = [ :error, :warning, :info, ]
  include Comparable

  def initialize( type )
    @type = type
  end

  def <=>( other )
    ERROR_RANKING.index( @type ) <=> ERROR_RANKING.index( other.type )
  end
end

entry1 = LogEntry.new( :error )
entry2 = LogEntry.new( :warning )

puts entry1.type.inspect
#=> :error
puts entry2.type.inspect
#=> :warning
puts( ( entry1 > entry2 ).inspect )
#=> false
puts( ( entry1 < entry2 ).inspect )
#=> true

但是也可以看看 Ruby 内置的日志记录库 Logger


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接