1 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:21:25 ] プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 ★注意★ Ruby 1.9.1 は初心者にはまだ時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。 (理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に完全対応していないためです。) 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 を習得すれば将来スムーズに 1.9 系に移行できるでしょう。 関連スレやURLは>>2-5 あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。 ■質問する人へ 質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。 ・モジュール名やエラーメッセージでググる ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/ ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。 ・詳しい内容(「動きません」「うまくできません」では回答しようがない) ・エラーメッセージ(自力で訳さずなるべくそのままで) ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる)) ・最終的にやりたいこと(もっとよい方法がある場合が多いので) 回答してくれた人には「ありがとう」のひとことをいってあげて。 ■回答する人へ 相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。 それができないならこないこと(だって初心者スレだもん)。 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
101 名前:96 [2009/12/10(木) 09:50:45 ] みなさんありがとう。Googり方が悪いんだよカス!とか言われると思ってました。
102 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:52:57 ] === が検索できるようになってたら罵倒されたと思う
103 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:53:39 ] >>101 いちいちスレあげんなカス!
104 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:57:37 ] >>65 分かりやすい解説ありがとうございました。 イメージがつきました。
105 名前:デフォルトの名無しさん [2009/12/10(木) 14:00:10 ] >>103 うるせーバカ
106 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 16:30:19 ] 2chブラウザ使っている人で、スレッドの位置を気にしている人はいるの? 俺は履歴とかブックマークからスレッドにたどり着いているので、板一覧とか 見ていないし、スレッドの位置も特に気にしていない。 そもそも、こういう掲示板のage/sageって自由であるべきで 他人が強制するものではないと思う。
107 名前:デフォルトの名無しさん [2009/12/10(木) 19:27:14 ] aというハッシュのキーにclassがあったらその値に " button"を追加して、なかったら"button"だけ、という記述を 下記のように書いたのですが、 もうちょっといい書き方ないもんでしょうか? [{}, {:class => "hoge"}].each do |a| a[:class] = (a[:class] ? a[:class] + " ": "") + "button" #←ここをなんとかしたい p a end
108 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 19:48:10 ] マジレス if a[:class] a[:class] += ": button" else a[:class] = "button" end ネタレス a[:class] = [a[:class], "button"].compact.join(": ")
109 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 21:16:51 ] デフォルト値が設定されてるとおかしなことになりそうな気が…
110 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 21:19:23 ] デフォルト値を設定すること自体がおかしいだろ
111 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 21:27:35 ] 二時間近く>>108 に突っ込む奴がいないわけだが 年末でいつもの人は忙しいのかw
112 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 21:53:53 ] デフォルト値は設定しちゃダメなの?
113 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 23:00:34 ] 配列aとbが対等な関係にある場合に、 a.zip(b) とするのは対称でなくて見た目が悪いと思うのですが、どう思いますか?
114 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 23:03:00 ] それ感じたことがある。けれど代替案が見つからない。
115 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 23:03:18 ] 別にどうも思いませんが まあ気になるならArrayクラスのクラスメソッドにでもしてしまうとよろし Array.zip(a, b) みたいなのなら問題あんめえ
116 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 23:04:58 ] >>115 それいいね。それなら、3項間以上でもすっきりかけるね。
117 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 23:05:20 ] Array.zip(a, b) みたいな形だとどう?
118 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 23:05:42 ] ついでにEnumeratorを返すようにしてほしいと思いませんか?
119 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 23:08:22 ] つーとむしろ Enumerator.zip(a,b) なんか変か?
120 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 23:34:04 ] >>107 [{}, {:class => "hoge"}].each do |a| a[:class] &&= a[:class]+" button" a[:class] ||= "button" p a end [{}, {:class => "hoge"}].each do |a| begin a[:class] += " button" rescue a[:class] = "button" end p a end def space_add h,s return nil if h.nil? h.replace( h+" "+s ) end [{}, {:class => "hoge"}].each do |a| space_add(a[:class],"buttom") || a[:class] = "button" p a end
121 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 23:53:39 ] >>113 ですが、新しいメソッド付加するほどでもないと思っていたら困ったことに・・・ ちなみに本当にほしいものは、長いほうに合わせて [[3, 1], [4, 2], [5, 2], [6, 2]] です。メソッド追加しないと無理ですかね? ################################ irb(main):005:0> a = [1,2] => [1, 2] irb(main):006:0> b = [3,4,5,6] => [3, 4, 5, 6] irb(main):007:0> a.zip(b) => [[1, 3], [2, 4]] irb(main):008:0> b.zip(a) => [[3, 1], [4, 2], [5, nil], [6, nil]]
122 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 00:02:14 ] 追伸: しかも欲しいものは配列じゃなくてEnumeratorです。 > zip(a,b).each{|e| p e} [1,3] [2,4] [2,5] [2,6] みたいに。
123 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 00:08:32 ] twitterとかで、投稿時刻を HH:MM:SS ではなく、「約15分前」「約2時間前」というふうに表示してますけど、 これをやってくれるRubyのライブラリはありますか。 ついでにJavaScriptのライブラリもあるとうれしいです。
124 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 00:35:15 ] ありません。自分で書いてください。 (Time.now.to_i - time.to_i) を適当に加工したらできるし。
125 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 00:45:02 ] railsならdistance_of_time_in_words
126 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 01:57:30 ] >>125 >distance_of_time_in_words Thank you very much! >>124 F***!
127 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 06:25:36 ] RubyはLispの替わりで使えるのか?
128 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 07:49:58 ] 文法が全然違うからLispのソースはまず動かないよ
129 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 08:25:43 ] >>126 Railsならそう言えよ。
130 名前:デフォルトの名無しさん [2009/12/11(金) 12:04:28 ] >>125-126 RailsのActionPackのActionViewっぽいね。これだけ使えないのかな
131 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 12:27:45 ] RailsはRailsで
132 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 13:40:27 ] >>130 require 'active_support' require 'action_view/helpers/date_helper' include ActionView::Helpers::DateHelper あー、あとI18n関係の設定がいるかな。以外と面倒かも。
133 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 13:57:40 ] そもそも単独で使うようにできてないからな たった一つの処理のために本質でないファイルをウンコのごとく読まなきゃならんし割に合わん
134 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 14:46:29 ] >>133 「ウンコのごとく読む」っていう比喩がわかんない。 どんな風に読むことを「ウンコのごとく」って言うの?
135 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 17:58:38 ] >>129 Railsだと分かっていたら答えられたとでもいうのかよwwww
136 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 18:23:13 ] たぶんYESなんじゃないかな
137 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 19:21:02 ] ,―ヽ____、― ,/ ノ ヽ ~\ / ノ Ruby ヽ ~\ / ノ ヽ、 `ヽ | ノ / ̄\ / ̄~ヽ ヽ i | ノ | ノ \ | <●> <●> ( ) \ | | | i / | / ヽ レ i (●_●) / i、 ,-――-、 ・ / i、 <(EEEEE)> ∵/ 楽しいプログラミング言語はIPA Rubyだけ i、 \___/ _/ \ ,ノ ,,.....イ.ヽヽ、ー-―一ノ゙-、. : | '; \_____ ノ.| ヽ i | \/゙(__)\,| i | > ヽ. ハ | ||
138 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 21:48:40 ] モジュールの定義の有無を確認する方法ってありますか? method_defined?のモジュール版みたいなのを探しているのですが・・・
139 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 21:57:29 ] >>138 require 'net/http' Object.const_defined?(:Net) #=> true Net.const_defined?(:HTTP) #=> true
140 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 23:46:17 ] メソッド中で変数を書き換えられる場合と書き換えられない場合の区別がいまだに分からないのですが、 X=[1,2,3] def f X[1]=4 end 大文字(const配列?)のくせにこれは書き換え成功する。 x = 1 def g x=2 end これはスコープ内で局所変数と解釈されて、書き換えられない。 Y=1 def h Y=2 end これは定数書き換えが不正と解釈されて通らない。 h()は仕方ないとしても、g()と同じ動作は欲しいので、どう実現すればいいか教えてください。 ポインタっぽいのがあると一番いいのですが・・・。
141 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 23:49:33 ] >>140 >X=[1,2,3] >def f X[1]=4 end >大文字(const配列?)のくせにこれは書き換え成功する。 前後にX.object_idを表示してみると、「同じオブジェクト」を 指したままであることが確認できるはず。 配列のような内部に状態を持つオブジェクトの状態を変更することは 定数という観点でいうと「書き換え」ではない。 >x = 1 >def g x=2 end >これはスコープ内で局所変数と解釈されて、書き換えられない。 >h()は仕方ないとしても、g()と同じ動作は欲しいので、どう実現すればいいか教えてください。 >ポインタっぽいのがあると一番いいのですが・・・。 オブジェクトと変数の区別を理解してから出直しておいで。
142 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:07:05 ] 返信ありがとうございます。 オブジェクトと変数の区別があるのは分かりますが、 X = Integer(1) と Y = [1,2,3] はどちらも 定数=「オブジェクトのインスタンス」 に見えるのですが。
143 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:12:11 ] irb(main):001:0> CONS = [0, 1, 2] => [0, 1, 2] irb(main):002:0> CONS = ["A", "B", "C"] (irb):2: warning: already initialized constant CONS => ["A", "B", "C"]
144 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:12:28 ] 定数は参照の付け替えが出来ないだけで 参照先のオブジェクトが内部状態を変えることには関知しない
145 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:18:59 ] では class Integer def f self = 8 end end X = Integer(3) X.f() p X みたいな感じで内部状態を変えることは原理的には可能でしょうか?
146 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:23:02 ] >>145 オブジェクトと変数の区別を理解してから出直しておいで。
147 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:25:02 ] いや、もちろん @なんとか=8 でしょうけど。
148 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:29:09 ] オブジェクトと変数の区別を理解したいので 質問を続けます。
149 名前:デフォルトの名無しさん [2009/12/13(日) 00:29:25 ] >>145 Integerのような組み込みのクラスだとそれできないから、i++とかインクリメンタル演算子が実装できないんだよね・・・
150 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:31:32 ] >>149 selfを変更できるクラスはRubyにはないぞ データ格納領域がRuby的に保護されてて触れない
151 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:36:43 ] selfはたんに気分で書いてしまったので気にしないでください。 (私のミスです) 自分で定義したクラスなら class MyInt def initialize(i) @i=i end def ++() # 前置演算子の定義の仕方はしらないですが・・・ @i+=1 end end でいいわけですよね。
152 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:36:49 ] もとのxの件はオブジェクトと変数の違いではなく ローカル変数のスコープの問題だねえ。
153 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:38:42 ] >>152 そうですね。本当はそれが知りたかったわけですが・・・。 グローバル変数にすればいいんだけど、なんか気持ち悪い。
154 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:41:31 ] なんか引数で参照渡して、それを書き換えればいいんだよ〜 みたいなのはないんでしょうか? ・・・たぶんないんでしょうね
155 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:44:42 ] 引数で渡していいならArrayみたいな内部状態を持つオブジェクトに包んで 渡すくらいかね。
156 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:48:32 ] 初心者なんで間違っているかもだけど、参照渡しだから引数に渡された オブジェクト自体を書き換えることはできるよね? def method(str) {str.gsub! /a/, '!'} x = "katakana" puts x #=> "katakana" method x puts x #=> "k!t!k!n!"
157 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:48:47 ] やっぱそれですか。 議論によって問題の所在がはっきりしてきました。 おつきあいありがとうございます。
158 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:51:40 ] >>156 それはたぶん文字の配列わたしてるですね。
159 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:53:10 ] えっ?
160 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:53:23 ] そうだ、eval使おうか(笑)!
161 名前:156 mailto:sage [2009/12/13(日) 00:54:39 ] >>158 Ruby のStringオブジェクトの内部ってArrayで表現されていたんですか? 知りませんでした。>< C言語みたいですね。
162 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:56:25 ] 158ですが、私も初心者なので、フォローお願いします。 普通の言語なら文字列の扱いはそうなってるんじゃないかなぁ?
163 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 01:06:12 ] 何の意味があるか分からない思いつきだけど通りました。 X='12' def f X.gsub!('12','2') end f() p eval(X)
164 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 01:22:35 ] >>162 文字列がイミュータブル(変更不可)な言語は普通にあるよ Pythonなんかもそう >>> s = 'abc' >>> s[0] = 'A' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment 上のごちゃっとしたところをまとめると * 変数はオブジェクトに付けられた矢印(あるいはラベル)。例: a = [1,2,3] * 変数を通じてオブジェクトを操作することが出来る。例: a[0], a[1] * Rubyの文字列はミュータブル(変更可能)なので 変数が指すオブジェクトの中身を書き換えることができる。例: a[1] = 20 # [1,20,3]
165 名前:156 mailto:sage [2009/12/13(日) 01:24:26 ] >>162 自分なりに調べてみました。 def method(obj) obj.object_id end str = "katakana" p str.object_id #=> 69877275538400 p method str #=> 69877275538400 この結果から分かりますが、上記の変数 str と obj は同一のオブジェクトを指しています。 したがって、変数 obj に対して破壊的なメソッド(オブジェクト自体を変更するメソッド)を使うと str が指しているオブジェクトも同一ですから、objに対して行った操作が反映されている、というわけですね。 あってますか? あと、Stringオブジェクトの内部表現については詳しくしりません。 Rubyのソースを読んでみればわかると思うのですが、まだそこまでのレベルではないので... スレ汚し失礼しましたです。
166 名前:164 mailto:sage [2009/12/13(日) 01:27:10 ] 例が文字列じゃなく配列になってた。それぞれ以下に読み替えて 例: s = '123' # sは文字列 '123' を指す 例: s[0], s[1] # sの一文字(バイト)目と二文字目を取得 例: s[1] = '5' # sの一文字目を '5' に変更 >>165 あってるお 内部表現なんて実装次第なんだから 出来ることを正確に把握するほうが大切
167 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 01:32:12 ] カビの生えた例だけどこんなのも貼っとく a = [0, 1, 2] b = a b[1] = 10 これでaが何になるのかわからなかった人は横着しないで入門書嫁
168 名前:140 mailto:sage [2009/12/13(日) 08:24:28 ] 昨日の者ですが、 結局クラスでラップする感じになるのかなぁ。 下は意図した通りに動きます。 def State(val) Monad.new(val) end class Monad def initialize(val) @val=val end attr_accessor :val end def f(st) st.val += 1 end X = State 1 f(X) p X.val
169 名前:140 mailto:sage [2009/12/13(日) 08:30:00 ] なるほどRubyって関数型言語だったのか!
170 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 08:33:09 ] Dir.globが探索するファイル/ディレクトリの条件って何ですか? i=0 Dir.chdir("C:\\"){Dir.glob('**/*'){i+=1}} p i =>150660 dir c:\ /s /b /a|find /c /v "" =>154483 C:\の全ファイルを選択→プロパティのファイル数+フォルダ数 =>153390 1〜2違うどころではないんだが・・・('A`)
171 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 09:22:12 ] >>170 DOSのコマンドを知らないから憶測だけど、 "."と".."を含めてる含めてないとか?
172 名前:デフォルトの名無しさん [2009/12/13(日) 09:40:23 ] >>170 日本語ファイル名が膨らまれているとか
173 名前:デフォルトの名無しさん [2009/12/13(日) 11:00:49 ] るびまのページいま停止中?
174 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 11:22:02 ] Ω ∅
175 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 11:44:38 ] p "あ" とすると、 "\202\240" 8進数で返ってくるのでわかりにくいです。 16進数で帰ってきて欲しいのですが、どうすればいいのでしょうか?
176 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 12:05:56 ] String#inspect の定義を変更すれば良い。 class String; def inspect; "\""+ self.each_byte.map{|c| "\\x%02x" % c }.join + "\""; end; end
177 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 12:15:41 ] 0x20...0x80はそのままにした方が目に優しそうだ あと?\と?"は別扱いでとか考え出したら面倒くせええ
178 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 12:17:32 ] >>176 それ、他のオブジェクトをinspectするときに影響が出ちゃわない?
179 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 13:03:51 ] 8進表記されてるのだけ、16進に直すのはどう? class String alias _inspect inspect def inspect self._inspect.gsub(/\\(\d+)/){ "\\x{%02x}" % $1.oct } end end
180 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 13:06:37 ] 文字列を16進表記にする関数的メソッドを定義するべきだと思うなあ
181 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 13:40:29 ] 直前の式の返り血が入ってる組み込み変数とかってないですか? Rubyを関数電卓代わりに使いたいんですけど
182 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 13:44:29 ] >>181 irb でよければ _ だと思う
183 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 13:44:54 ] >>181 irb irb> 1+2 3 irb> _ +4 7 まあ返り値ならなんでもいいんだけど irb> Time.now Sun Dec 13 13:40:19 +0900 2009 irb> _.year 2009
184 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 13:48:02 ] ありがとうございます できればirbじゃなくても使いたいんですが無いですか
185 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 13:52:21 ] 関数の戻り値は最後の参照みてるんだし @かなにかに保持してくれるといいと祈り続けて早10年
186 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 14:08:15 ] >>179 俺もそれ考えたけど"\\1000"とかで困る
187 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 15:24:26 ] >>180 こうするのが一般的? p "あ".unpack("H*")
188 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 18:12:58 ] PHPのcall_user_funcにあたる機能はRubyでも実現できますか? 実行時に呼び出すメソッドを切り替えたいのです。
189 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 18:15:34 ] >>188 send, evalなど
190 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 18:24:48 ] >>188 ありがとうございます。
191 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 18:25:33 ] 間違えた…>>189 でした
192 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 18:49:28 ] 異なる文字コードの文字列を同時に出力するとかじゃない限り 適切に漢字コードを指定しておけばちゃんと日本語表示されるんじゃないの? $KCODE = 'S' p "あ" > "あ" 文字じゃないバイナリ列とか表示させるときに16進文字列がいいのなら そういう出力メソッドを作るなりすれば
193 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 19:07:54 ] 1.9 なら encoding を文字列が持ってるからできるが、1.8 なら無理だね。 あと $KCODE は 1.9 じゃ廃止だ
194 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 01:00:47 ] module Hoge def f1 end def f2 end ・・・ってかんじでメソッドがたくさんあったときに module_function :f1,:f2,... って全部書くしか、外からアクセスする方法はないでしょうか? end
195 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 01:05:21 ] include Hoge で f1 や f2 を取り込めるよ
196 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 01:12:46 ] 名前空間は汚染したくないので Hoge::f1 というアクセスだけ許したいのですが・・・ いちいち書くのは保守が面倒だと思ったので。 いま考えてるのは module_function self.methods.join(' ') #未完成 みたいな怪しい方法です。
197 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 01:20:55 ] module M def m1; "m1"; end extend M end M.m1 #=> "m1"
198 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 01:22:36 ] どんぴしゃです! ありがとうございます。
199 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 05:51:45 ] メイン関数は書いた方が良いのでしょうか?
200 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 06:07:46 ] >>198 リファレンスより If used with no arguments, subsequently defined methods become module functions. モジュール定義の頭に module_function と引数なしで書いておけば 以後に定義するメソッドにはすべて module_function が適用される。 public, private とかと同じだよ。
201 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 06:28:54 ] >>199 メイン関数って スクリプトを実行した時に処理系が最初に呼び出すメソッド、という意味? そういう意味なら、書けない、でFA そんな取り決めないし