Hatena::ブログ(Diary)

まめめも このページをアンテナに追加 RSSフィード

2009-11-15

[] _ 1.2 リリース

ref: アンダースコアだけで Ruby プログラムを書くライブラリ _ - まめめも (2009-04-02)

ref: http://gemcutter.org/gems/_

なんか trunk で動かなくなっていたので修正し、GemCutterアップロードしました。GemCutter なのでめでたく

$ gem install _

だけでインストールできるようになりました。

どんなライブラリか簡単に言うと、以下のように _ だけで任意の Ruby スクリプトが書けるライブラリです。詳しくは参照を見てください。

Hello, world! プログラム

require "_"
____ _ _____ ____ __ ____ ____ __ ___ ____ __ __ _ ______
_____ ___ _ _ ___ _____ ______ ____ _ _ ____ _ _ ____ _
____ __ __ ___ _ ______ ___ ____ __ ______ ____ _ ____ ____
__ _ ____ _ _ ___ _____ _____ _ ______ ____ _ ______ _____
アンダースコアだけで Ruby プログラムを書くライブラリ _ - まめめも %282009-04-02%29

Ruby初心者Ruby初心者 2016/01/01 09:02 Ruby勉強中のものです。初心者的な質問で申し訳ありません。
「楽しいRuby第4版」を見ながら勉強をしています。

例えば、

List 8.13 : http_get.rb

require "net/http"
require "uri"
url = URI.parse("http://www.ruby-lang.org/ja/")
http = Net::HTTP.start(url.host, url.port)
doc = http.get(url.path)
puts doc

というRubyがあります。(http://tanoshiiruby.github.io/4/list/#ch08)

これをRubyのソースのまま実行すると
#<Net::HTTPOK:0x00000001141198>
で正常に実行できます。

これをアンダースコア(_)Ver1.2で_だけにすると

$ ruby http_get.mame
/usr/local/pkg/ruby/1.9.3-p551/lib/ruby/gems/1.9.1/gems/_-1.2/lib/_.rb:22:in `eval': can't convert Array to String (Array#to_str gives Array) (TypeError)
from /usr/local/pkg/ruby/1.9.3-p551/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from (eval):1:in `block in <top (required)>'
from /usr/local/pkg/ruby/1.9.3-p551/lib/ruby/gems/1.9.1/gems/_-1.2/lib/_.rb:22:in `eval'
from /usr/local/pkg/ruby/1.9.3-p551/lib/ruby/gems/1.9.1/gems/_-1.2/lib/_.rb:22:in `block in <top (required)>'

requireの箇所でエラーになってしまいます。
この回避方法は何かありますでしょうか。もしよろしければ教えてください。

ku-ma-meku-ma-me 2016/01/01 10:06 報告ありがとうございます。method_missing があると require に失敗するみたいですね。rubygems のバグか仕様か微妙なところです。

そのうち調べたいですが、とりあえずの対処としては、元プログラムの先頭で

begin
Object.send(:remove_method, :foo)
rescue NameError
end

とやると直ると思います。

ku-ma-meku-ma-me 2016/01/01 10:07 間違えました、以下が正しいです。

begin
Object.send(:remove_method, :method_missing)
rescue NameError
end

Ruby初心者Ruby初心者 2016/01/02 19:58 ku-ma-me様
返信ありがとうございます。問題なく実行できました!ありがとうございますm(_ _)m
ちなみに元々のList 8.13 : http_get.rbなのですが、どこでmethod_missingが発生するのでしょうか。参考書についている簡単なプログラムなのでmethod_missingが発生する箇所がどこなのかわからず、もし差支えなければ後学のために教えていただけると助かります。
今回の回答大変助かりました。ありがとうございます。

ku-ma-meku-ma-me 2016/01/02 21:28 何かを require するだけのプログラムでエラーになるので、おそらく rubygems の require 実装の中で発生していると思います(きちんと調べていないですが)。なので、http_get.rb に問題はないです。

要するに、強いて言えば rubygems のバグです。ただし、rubygems の人たちが「Object#method_missing が定義されているような環境はサポートしない」と言えば、仕様ということになります。

Ruby初心者Ruby初心者 2016/01/04 17:23 ku-ma-me様

回答ありがとうございます。rubygemsのrequire実装の中と言うことになりますと、とても深い気がしています。細かい点いろいろとあるものだと感じています。
この度は迅速に御対応頂き、また丁寧に対応して頂きとてもありがとうございました。
心から感謝しております。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/ku-ma-me/20091115/p1
Connection: close