私はRubyで字句解析器を構築しており、シンボルを収集してシンボルテーブルに保存しようとしています。シンボルの設計に関する私の主な質問と、それが静的テーブル(すべてのデータがクラスレベルで保持されることを意味する)であるべきか、それともインスタンスごとであるべきかについて。
オプション 1: クラス レベルのデータ構造
require 'SymbolTableEntry.rb'
class SymbolTable
@sym_table = Array.new(500)
def initialize()
end
def SymbolTable.add(element, index)
@sym_table[index] = element if element.is_a? SymbolTableEntry
end
def SymbolTable.to_s
pp @sym_table
end
end
このスキームでは、SymbolTable クラスは一種の「静的」機能を備えています。つまり、SymbolTable のインスタンスを実際に作成するのではなく、存在する唯一のオブジェクトはクラス レベルのオブジェクトです。
SymbolTableEntry
(ここでは定義していませんが、有効なオブジェクトであると仮定します)
元:
irb(main):002:0> require 'SymbolTable.rb'
=> true
irb(main):003:0> ste = SymbolTableEntry.new
=> #<SymbolTableEntry:0x7ef36884>
irb(main):004:0> SymbolTable.add(ste, 10)
=> #<SymbolTableEntry:0x7ef36884>
irb(main):005:0> SymbolTable.to_s
[nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
#<SymbolTableEntry:0x7ef36884>]
=> nil
オプション 2: インスタンス レベルのデータ構造
require 'rubygems'
require 'backports'
require 'SymbolTableEntry.rb'
class SymbolTable
def initialize()
@sym_table = Array.new(10)
end
def add(element, index)
@sym_table[index] = element if element.is_a? SymbolTableEntry
end
def to_s
pp @sym_table
end
end
このスキームでは、シンボル テーブルに値を追加するために、SymbolTable クラスのインスタンスを実際にインスタンス化する必要があります。
irb(main):001:0> require 'SymbolTable.rb'
=> true
irb(main):002:0> st = SymbolTable.new
=> #<SymbolTable:0x7eeb6c9c @sym_table=[nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil]>
irb(main):003:0> ste=SymbolTableEntry.new
=> #<SymbolTableEntry:0x7eeb4d5c>
irb(main):004:0> st.add(ste,10)
=> #<SymbolTableEntry:0x7eeb4d5c>
irb(main):007:0> st.to_s
[nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
nil,
#<SymbolTableEntry:0x7eeb4d5c>]
=> nil
どのデザインを使用するか、または使用することを好むかについて、すべての意見や、一般的な Ruby コードに関するコメントをお待ちしております。
ありがとう