読者です 読者をやめる 読者になる 読者になる

PerlerのRuby日記

Rubyとか

継承先の子クラスの呼び方が分からない

Perlだとこうなるのは、Rubyだとどうなるのか。

package Hoge;

sub new {
  my $class = shift;
  bless {}, $class;
}

sub fuga {
  my $self = shift;
  my $class = ref $self;
  "$class\::Fuga"->new;
}

package Piyo;

our @ISA = ('Hoge');

package Piyo::Fuga;

sub new {
  bless {}, __PACKAGE__;
}

package main;
use Data::Dumper;

my $fuga = Piyo->new->fuga;
print Dumper $fuga; #=> $VAR1 = bless( {}, 'Piyo::Fuga' );

こんな感じ。

f:id:rightgo09_ruby:20121105231536p:image

つまり親クラスのHogeが架空の子クラスFugaを作るfuga()メソッドを定義している。

一方Rubyだと、こう?

class Hoge; end

class Piyo < Hoge
  def fuga
    Fuga.new
  end

  class Fuga
  end
end

p Piyo.new.fuga #=> #<Piyo::Fuga:0x007fda54103a70>

架空の子クラスではなく、実在のPiyo::Fugaを作るfuga()がPiyoクラス内に定義が移ってしまっている。。。

どうすればいいんだろう。

(こういう時、ただの文字列から簡単にクラス扱いできると楽チンだと思う)