こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

【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

となっていたので、上記の様に書いてみたのですが、何が悪いのでしょうか?

ご指導のほど、宜しくお願いいたします。

投稿日時 - 2009-11-17 03:41:37

QNo.5454256

暇なときに回答ください

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

file.rbとかstat.rbとか、何のことかわからなかったですが、どうやらおそらく、rubygemsのwin32-file-statの話ですね。

require "win32/file"
class File::Stat
def name
@file
end
end

でいいと思います。やってみましたが、ファイル名はUTF-16で格納されていますね。

投稿日時 - 2009-11-18 23:51:04

お礼

notnotさん、ご回答ありがとうございました。

>file.rbとかstat.rbとか、何のことかわからなかったですが、どうやらおそらく、rubygemsのwin32-file-statの話ですね。

『stat』をrubyのディレクトリ配下で検索して出てきたファイルでして、
今一度確認しましたら、rubygemsのwin32-file-statでした。

File.statは、require "win32/file"すれば、stat.rbのFile::Statになるって事なんですよね。

また、質問になっちゃうのですが、require "win32/file"してない状態のFile.stat(つまりは組み込みのFile.stat)を改造するのって、どうしたら良いのですか? ご存知でしたら教えてください。お願いいたします。

投稿日時 - 2009-11-19 20:24:26

ANo.1

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

>つまりは組み込みのFile.stat)を改造するのって、どうしたら良いのですか? 

あまり綺麗には行きませんね。とりあえず下記で出来ます。

class File::Stat
 attr_accessor :name
end
class << File
 alias orig_stat stat
 def stat(f)
  w=orig_stat(f)
  w.name=f
  w
 end
end

投稿日時 - 2009-11-19 22:47:22

お礼

notnotさん、ご回答ありがとうございました。

>あまり綺麗には行きませんね
たしかに強引な感じはしますが、
attr_accessorで出来ちゃうんですね!! すばらしい!!

ありがとうございました。

投稿日時 - 2009-11-20 00:41:25

あなたにオススメの質問