3

私は Ruby の学習を始めたばかりですが、OOPL としての独自性をどのように活用できるかについて、すでに大きなアイデアを持っています。私の最初のものはタイトルで適切に説明されています: Ruby でキーワードを作成 (またはシミュレート) することは可能ですか? 私は repl で少し遊んでいて、エイリアシングで面白いことを発見しました。

たとえば、次のようにキーワードクラスのエイリアスを作成しようとすると、

alias :magic :class

を出力するので、動作しているように見えますnil。ただし、これは単なるエイリアシングObject#class方式です。キーワードは定数ではなく、インタープリター自体にハードコードされている可能性が高いため、キーワードをエイリアスする方法はないと思います。

(ただし、この小さな実験では興味深い結果が得られました。通常、Object#class明示的なself識別子なしでメソッドを呼び出すことはできません。単にclassrepl を入力すると、キーワード と混同されるため、構文エラーが発生します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こともできます。または両方を行います!typeto_symaNameClass.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?) として、これを行うことについて継承的または慣習的に悪いことはありますか? たとえば、それは本当に高価であったり、何らかの形で危険であったりするでしょうか?

4

2 に答える 2