私はRubyでコンパイラを書いていますが、インスタンスメソッドがインスタンス変数を変更する多くのクラスがあります。例えば、私のレクサー(コード内のトークンを見つけた部分)は、このように動作します:メソッドはRubyでインスタンス変数を変更する必要がありますか?
class Lexer
attr_accessor :tokens
def initialize(input)
@input = input
@tokens = nil
end
def lex!
# lex through the input...
# @tokens << { lexeme: 'if', kind: :if_statement }
@tokens
end
end
lexer = Lexer.new('if this then that')
lexer.lex! # => [ { lexeme: 'if', kind: :if_statement }, ... ]
lexer.tokens # => [ { lexeme: 'if', kind: :if_statement }, ... ]
これが有効な練習ですか?または、メソッド(例:#lex
)が入力を受け取り、インスタンス変数を変更せずに結果を返すアプローチを使用する必要がありますか?
class Lexer
def initialize
end
def lex(input)
# lex through the input...
# tokens << { lexeme: 'if', kind: :if_statement }
tokens
end
end
lexer = Lexer.new
lexer.lex('if this then that') # => [ { lexeme: 'if', kind: :if_statement }, ... ]
いいえ、@トークンでは何もしません。私はかなり多くの私の質問に答えると思う、ありがとう! –
@EthanTurkeltaub \tこれは機能と非機能のアプローチのようなものです。 –