私は Ruby の学習を始めたばかりですが、OOPL としての独自性をどのように活用できるかについて、すでに大きなアイデアを持っています。私の最初のものはタイトルで適切に説明されています: Ruby でキーワードを作成 (またはシミュレート) することは可能ですか? 私は repl で少し遊んでいて、エイリアシングで面白いことを発見しました。
たとえば、次のようにキーワードクラスのエイリアスを作成しようとすると、
alias :magic :class
を出力するので、動作しているように見えますnil
。ただし、これは単なるエイリアシングObject#class
方式です。キーワードは定数ではなく、インタープリター自体にハードコードされている可能性が高いため、キーワードをエイリアスする方法はないと思います。
(ただし、この小さな実験では興味深い結果が得られました。通常、Object#class
明示的なself
識別子なしでメソッドを呼び出すことはできません。単にclass
repl を入力すると、キーワード と混同されるため、構文エラーが発生しますclass
。ただし、Object#class
メソッドをエイリアス化することにより、インタープリターはもう混乱しないので、識別子なしでエイリアスを使用できます.かなり気の利いた.)
現時点では、Ruby に関する知識が限られているため、キーワードをシミュレートする方法は、class
たとえば次のようにすることだと思います。
# in some file Magic.rb
module Magic
def self.type
# do something to evaluate the given block as a class definition
yield if block_given?
end
end
Magic.type Awesome do
def initialize;end
def who_am_i?
puts "I'm Awesome!"
end
end
x = Awesome.new # desired output: #<Awesome:0x1234abc>
x.who_am_i? # desired output: "I'm Awesome!"
しかし、それは私が望んでいたよりも醜いです。何かご意見は?
編集:いじくり回してグーグルで調べた後、匿名クラスのインスタンス化、ブロック、およびを活用して、私が良い解決策であると思うものを発見しましたObject#const_set
:
def type aName, &block
Object.const_set(aName, Class.new(Array, &block))
end
type :AwesomeArray do
def intialize
puts "Initialized."
end
def magic
puts "DO ALL THE MAGICKS!"
end
end
x = AwesomeArray.new # --> #<Awesome:0x12335abc>
puts x.is_a? AwesomeArray # --> true
puts x.is_a? Array # --> true
puts x.is_a? Object # --> true
x.magic # --> "DO ALL THE MAGICKS!"
x |= [1, 2, 3] # --> [1, 2, 3]
ユーザー定義のメソッドは、効果的にキーワードtype
を模倣します。または、シンボルの代わりに文字列を使用して呼び出し、に渡すときにへの呼び出しを追加するclass
こともできます。または両方を行います!type
to_sym
aName
Class.new
def type aSymbol, &block
Object.const_set(aSymbol, Class.new(Array, &block))
end
def type_str aString, &block
type aString.to_sym, &block
end
さて、Ruby n00b (r00b?) として、これを行うことについて継承的または慣習的に悪いことはありますか? たとえば、それは本当に高価であったり、何らかの形で危険であったりするでしょうか?