• ベストアンサー

Rubyでクラスファイルをディレクトリで階層化したい

いつもお世話になっています。 クラスファイルを違う階層にした時にうまくアクセスできなくて困っています 例えば test/hoge.rbの中に定数HOGEがある場合、どうアクセスすればいいですか? よろしくお願いします

  • Ruby
  • 回答数2
  • ありがとう数8

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

hoge.rbでクラスHogeを定義しているので、hoge.rbをrequireして、Hogeへのアクセスを記述します。 で、Foo.rbはこんな感じ: require 'test/hoge.rb' puts Hoge::HOGE;

hakatanosi
質問者

お礼

うまくアクセスすることが出来ました!ありがとうございました! なるほど、さきに読み込む宣言をしておくんですね とても助かりました

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

Perlと混同して、フォルダ階層をクラス階層と思っているとか。 単にhoge.rbに書かれてるクラス/モジュール定義位置に応じて、アクセスすれば良いかと。 実際のtest/hoge.rbの定義を補足したら回答を得られやすいと思います。

hakatanosi
質問者

補足

Perlはやったことがないです、JavaとCを少し経験した程度です。 よくRubyをわかってないんで定義を補足したいと思います。 test/hoge.rb class Hoge HOGE = "hogehoge" end Foo.rb class Foo puts test/hoge::HOGE # ここでtest/hoge.rbのHOGEにアクセスしたい end

関連するQ&A

  • Ruby 文法 ブロックの中で自クラスの定数を呼ぶ

    以前した質問(http://okwave.jp/qa/q8484921.html)と非常に似てる質問になります。 以前の質問ではブロックの中で、そのクラスのメソッドを呼ぶ時のことでしたが、今回はメソッドではなく、定数にアクセスする時の質問です。 class Hoge VAL=1 def piyo yield end end h=Hoge.new h.piyo do |this| puts Hoge::VAL #<ーココの話 end 上の様に書く時、ブロックの中で、そのクラスの中の定数を参照するとき、上の例だと Hoge::VAL と書いてますが、Hoge::と書くのがとても嫌なので、以下の様に書いてみました。 class Hoge VAL=1 def piyo yield self end def retVal VAL end end h=Hoge.new h.piyo do |this| puts this.retVal #<-Hoge::VALと書かなくてよくなった。 end が、しかし実はVALなどの定数は多数あり、その数の分だけ値を返すメソッドを書くなんて、もっと嫌です。 なんか良い書き方はあるのでしょうか? 以下、蛇足なのですが、そもそもクラスの中でしかアクセスしないマジックナンバー的な定数の定義の仕方が間違っているのでしょうか? moduleに定義して、クラスの中とブロック使うところでincludeするなどの方がスッキリするのかも。。

    • ベストアンサー
    • Ruby
  • 【ruby】特異クラスを使って,File.statをカスタムしたい

    File.statに、nameというメソッドを追加したいです。 st=File.stat('hoge.txt') puts st.name #=> hoge.txt 上記のように使いたいのです。 そこで、以下の様に書いてみました。(行頭のスペースは全角です) class File  class << self   def stat(file)    st=File::Stat.new(file)    class << st     def name      @file     end    end    st   end end end st=File.stat('./hoge.txt') puts st.name #=> nil 上記実行結果はnilが出力され、期待した結果は得られませんでした。 上記の様に書いた理由を以下に記します。 クラスメソッドstatは、file.rbのclass Fileの中に定義されていて、 stat.rbのFile::Stat.new(file)を戻り値としていました。 stat.rbのclass File::Statのinitializeでは、 def initialize(file)  @file = file  (略) end となっていたので、上記の様に書いてみたのですが、何が悪いのでしょうか? ご指導のほど、宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • 【Ruby】require について

    あるディレクトリでirbを起動して、require 'hoge'とした時にtrueやfalseが返ってくる。 つまり、'hoge' というライブラリはロードされている思います。 しかし、あるディレクトリ内のrbファイルで、require 'hoge' と記述してrbファイル実行すると'LoadError: cannot load such file'とエラーが出ます。 kernel_require.rb内でエラーが起きているようなのですが、何か参考となるHPやアドバイスがありましたらよろしくお願いします。

  • SSIによる異なる階層からの呼び出し方

    1.http://www.loplopland.com/test/resume 2.http://www.loplopland.com/test/resume/data/holland ウェブページで上の2つの階層で表示しているSSIから http://www.loplopland.com/test/resume/data/holland の階層にあるファイルにアクセスする方法ですが、 data/holland/アクセスファイル.html とすると2では http://www.loplopland.com/test/resume/data/holland/data/holland/アクセスファイル.html にあると読み込んでしまいます。 どちらの階層で表示しているページでも同じ http://www.loplopland.com/test/resume/data/holland/アクセスファイル.html と読み込むためにはどうしたらよいでしょうか? 読み込む元になるファイルのリンクを"http://"から書けばいいんですが、それだと/test/を取り除いたときにすべてリンクを直さないといけなくなることや、ファイル容量がかさばるためなるだけ控えたいと思っています。

  • VC#のFtpWebRequestで多階層のディレクトリを作成すること

    VC#のFtpWebRequestで多階層のディレクトリを作成することができません。 以下のようにすることで例えばftp://hogehoge.com/hoge1/というディレクトリがあったとしてそのhoge1の中にhoge2というディレクトリを作る事は出来ます。一階層のディレクトリまでなら作れることは確認しています。 Uri u = new Uri("ftp://hogehoge.com/hoge1/hoge2/") ; System.Net.FtpWebRequest ftpReq = (System.Net.FtpWebRequest)System.Net.WebRequest.Create(u); ftpReq.Credentials = new System.Net.NetworkCredential(ini[1], ini[2]); ftpReq.Method = System.Net.WebRequestMethods.Ftp.MakeDirectory; System.Net.FtpWebResponse ftpRes = (System.Net.FtpWebResponse)ftpReq.GetResponse(); ftpRes.Close(); しかし、ftp://hogehoge.com/hoge1/hoge2/hoge3/hoge4/hoge5/ ぐらいまでディレクトリを作ろうとした時、上のUriの値を ftp://hogehoge.com/hoge1/hoge2/hoge3/hoge4/hoge5/ にしてもディレクトリを作る事ができません。 ftp://hogehoge.com/hoge1/hoge2/ のように一階層なら上でも書いたとおり作成できますが ftp://hogehoge.com/hoge1/hoge2/hoge3/ と指定した場合、作成することができません。 場当たり的に上のコードを4,5回繰り返すことでhoge5までの作成は可能なことは可能でしたが、リクエストを大量に送りつけてしまい、ソースも長くなってしまうので他の方法を考えたいです。 他の方法でもかまいませんので何かいい方法はございませんでしょうか。 環境 VC# 2008 .netFramework 4.0 winXP SP3

  • 複数のRubyスクリプトを1つのexeにする方法を教えてください

    Rubyスクリプトをexe化するには、rb2exeがありますが、rb2exeでは1つのexeに1つのスクリプトしか入れれないため、requireしているスクリプトはexe化できない様です。 例えば、hoge.rbで require "fuga.rb" としている場合、 rb2exe hoge.rb でhoge.exeを作成しても、hoge.exe中にはfuga.rbが含まれないため、結局はhoge.exeの実行にはfuga.rbが必要になってしまいます。 requireしているファイルもまとめて1つのexeにしたいのですが、どうすればよいのでしょうか? よろしく願いします。

  • C/C++でrubyファイルをrequireしたい

    いつもお世話になってます。 Rubyで作ったファイルをC/C++として実行できるようにしたいです。つまりruby_pro.rbを作ってc_pro.cのなかでrequire 'ruby_pro.rb'のようなことをしたいのですが、できますか? よろしくお願いいたします。

  • 【ruby】【文法】スパークラスのスーパークラスのメソッドを呼び出したい

    スパークラスのスーパークラスのメソッドを呼び出したいです。 たとえば、Hoge3のスーパークラスがHoge2で、さらにそのスーパークラス がHogeの時、Hoge3からHogeのメソッドを呼び出したいのです。 もう少し具体的に説明させてもらいます。 class Hoge  def initialize()   @name='hoge'  end end class Hoge2 < Hoge  def initialize()   super   @name='hogehoge'  end end class Hoge3 < Hoge2  def initialize()   super #これではスーパークラスHoge2のメソッドが呼ばれてしまう。   puts @name  end Hoge3.new() 上記実行結果は、hogehogeが出力ですが、 スーパークラスのスーパークラスが設定した@name値、 'hoge'が出力されるようにしたいです。 『Hoge3クラスはHoge2クラスを継承すればよいではないか?』 とも思うでしょうが、Hoge2クラスには、Hogeには無い機能が多く拡張されてると考えてください。 ご指導のほど、宜しくお願いいたします。

  • .NetFrameworkの階層構造

    いつもお世話になっております。 あるデータ型から、あるデータ型への型変換をしたいときに気になるのが、階層構造だと思います。 そこで、質問です。MSDNのヘルプの中でもよいし、Webでもよいのですが、できるだけたくさんのクラスの階層構造を書いてあるところがないでしょうか?以前はMSDNのヘルプにクラスのところに書いてあった気がするのですが。 .NetFramework2.0以降でお願いします。

  • ファイルサーバーの階層について

    お世話になります。 会社でファイルサーバーを管理している者です。 現在のファイルサーバーはrootに「全共有」というフォルダがあり、そこは 全社の誰でもがアクセスでき、誰でも好きなようにフォルダ作成、ファイルをいじれます。 ただ、その結果「全共有」の中がエライ状態になってファイルやフォルダの収集がつなくなっています。 そこでこの「全共有」の中をキレイにしようと思います。 使い方は引き続き自由に使わせようと思いますが、最初にフォルダだけはこちらで設定しようかと思っています。第一階層で[営業]・[工場]・[共通]とかに設定して、Excelなどのファイルはこの3つのフォルダのどれかの配下に置くようにルール化する、など考えておりますが、一般的にどのような感じで設定するのがよいのか五ご教示いただけますでしょうか。よろしくお願い致します。

専門家に質問してみよう