アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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

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

A 回答 (2件)

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



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

でいいと思います。やってみましたが、ファイル名はUTF-16で格納されていますね。
    • good
    • 0
この回答へのお礼

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

>つまりは組み込みの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
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2009/11/20 00:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!