[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 03/12 09:10 / Filesize : 211 KB / Number-of Response : 848
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 35



1 名前:デフォルトの名無しさん [2010/03/04(木) 11:00:57 ]
プログラミング言語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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

496 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 17:31:53 ]
質問です
エクセルで書かれた名簿を整理して出力するプログラムを書いているのですが、
名前、郵便番号、住所の分離が上手くいきません
与えられた名簿は半角or全角スペースで区切られているのでsplitを使おうと試みているのですが、
例えば以下のように記述すると"―"や"県"が消えてしまいます

puts '山田 太郎   〒0000−0000 山田県山田333-333-333-333'.split(/[  〒]+/)

何か良い知恵があればなにとぞご教授お願いします
ちなみに元のプログラムではputsせず、分離後にある配列に入れています

497 名前:496 mailto:sage [2010/03/15(月) 17:34:18 ]
追記失礼します
rubyはver1,87を使用しております

498 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 17:48:49 ]
>>496
Excelってことなので、WindowsでSJISのソースコードとして、
スクリプトの先頭に

#! ruby -Ks

もっと推奨の方法があったかもしれない

499 名前:496 mailto:sage [2010/03/15(月) 17:51:44 ]
>>498
ご教授いただいたとおりにしたところ速やかに改善されました!
ありがとうございます

500 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 17:53:59 ]
Rubyが取り扱う文字のエンコーディングを指定しなければASCIIとして扱われてしまうのでそういうことになる
Ruby 1.8まででは
1 Ruby起動時にスイッチで -Ks とかで指定する
2 スクリプト先頭に
#!ruby -Ks
とか書いておくとスクリプト実行時にそのスイッチが考慮される
3 $KCODE を設定する
4 個々の正規表現のオプションでエンコーディングを指定する

ただし1,2はスクリプト自体のエンコーディングと正規表現の振る舞いの両者を変更するが
3,4だと正規表現の振る舞いを変えるだけなので
スクリプトがシフトJISで書かれていると
p "表"  # エンコーディングを正しく指定しないと 文字列リテラルが終了してないことに("\225\" と同じ扱い)
とかのいわゆるダメ文字(2バイト目が\)問題にぶち当たる

UTF-8やEUC-JPだとそのような問題は起きない(のかな?)


501 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:05:26 ]
るびまってRubyのマニュアルのことだったの?
Ruby Magazineの事だと思ってた

502 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:15:09 ]
>>491
どもです
礼するの忘れてやした

503 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:16:09 ]
るびま:Rubyist Magazine
るりま:Ruby reference manual

Ruby Magazineだと思いこんでると、無関係な記事が多すぎるように映るかもね

504 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:16:29 ]
>>501
どっちでもいいよ
いやよくはないが
初心者的にはるびまは読むべきではない
古くて有害な情報が渾然一体となっている



505 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:19:31 ]
>>503
それ、テンプレに入れたらどうかね?

506 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:24:13 ]
Rubyinstか。失礼。
上のほうよく見たらるびまとるりまの区別が付いてない(人がいる)って話だったのね
読み違えてたわ

507 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:27:44 ]
まだ間違ってるぞw

508 名前:496 mailto:sage [2010/03/15(月) 18:29:54 ]
>>500
亀ですが、ありがとうございます
これを気に文字コードにも意識を向けてみます

509 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 19:16:01 ]
くっ
Rubyist

510 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 19:51:11 ]
includeは名前空間を使えるようにするものってことで、おk?
C++@namespaceみたいな感じ

511 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 19:53:43 ]
なんというか include はふつうに include だと思うのだが
既存言語の機能になぞらえないと理解し難いほど複雑難解な概念なのだろうか

512 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 20:00:50 ]
includeの動作的には本当に>>444だよね
メソッドを探す順番の指定をする方法のひとつ

513 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 20:07:50 ]
モジュールの存在理由のほうがムズカシイかもしれない

514 名前:510 mailto:sage [2010/03/15(月) 20:34:24 ]
読んでいた記事が間違えていたらしい

本当の使い方は、結局なんなんだろ?
Mixinを実現するためにしか使わないのか



515 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 20:39:59 ]
モジュールは、メソッドを用途ごとにまとめるためのしくみ
メソッドがあるだけで、オブジェクトには依存しない機能のカタマリ

共通の機能をメソッドから追い出して別途メソッドを作るのと同じように、
共通の機能をクラスから追い出して別途モジュールを作る(でincludeする)というのも妥当

516 名前:デフォルトの名無しさん [2010/03/15(月) 20:45:11 ]
Mixinのためと単なる名前空間のため両方に使われる

517 名前:510 mailto:sage [2010/03/15(月) 20:54:21 ]
>>515-516
thx

518 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:17:04 ]
プロパティも実装されていない糞言語

519 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:27:30 ]
それで遊んでくれるのはPythonスレぐらいだぞ
ここは意外とDRY

520 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:52:35 ]
クラスインスタンス変数とは、そのクラスオブジェクトの特異クラスに属する
インスタンス変数という理解で正しいですか?

521 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 23:00:11 ]
ごめん、さっき違うスレで質問したけど理解してなかったorz

3 class Hoge
4  def self.set
5    @hoge = "dynamic"
6    $hoge = "static"
7  end
8
9  def self.out
10    puts @hoge
11    puts $hoge
12   end
13 end
14
15 Hoge.set
16 Hoge.out

実効結果
dynamic
static

$hogeと@hogeって何が違うのさ?

522 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 23:12:55 ]
理解してたらああは言わん
クラスインスタンス変数はクラスオブジェクトが存在する限り存在する

Hoge と書くことで定数 Hoge に Class クラスのインスタンスが Ruby によってセットされる
(同名のクラス定義がなかった場合は定数とみなされ、事前に代入されてない未定義定数でエラー)
で、Hoge.set を実行することでインスタンス変数 @hoge がインスタンスの中でふつうに設定される
それが属するインスタンスとは Class クラスのインスタンスで、つまり定数 Hoge が指すものだ
だから、無理矢理 Hoge の内容を nil にするとインスタンス変数 @hoge はスコープごと失なわれる

irb> class Hoge; def self.set; @hoge='hoge'; end; end
irb> Hoge.set
irb> p Hoge.instance_variable_get(:@hoge)
"hoge"
irb> Hoge = nil
(irb):4: warning: already initialized constant Hoge
irb> p Hoge.instance_variable_get(:@hoge)
nil


523 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 23:22:49 ]
特異メソッド上で書くからわかりにくい?

class Hoge
@hoge2="hoge2"
end

p Hoge.instance_variable_get(:@hoge2)

は "hoge2" を返すよ

524 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 23:38:33 ]
"プログラミング言語 Ruby" のp.326のなかほどに
クオート文字列にマッチすることを意図した正規表現の例が以下のように
載ってるんだけど,文字集合内で番号指定後方参照ってできたっけ?

/(['"])[^\1]*\1/

わがRuby1.9.1ではこうなった

re = /(['"])[^\1]*\1/
p %('\1')[re] #=> nil
p %('hoge'hoge')[re] #=> "'hoge'hoge'"

いちおう念のために言っておくと
クオート文字列にマッチする正規表現を求めているわけじゃなくて
文字集合内で後方参照や部分式呼出しができるか否かの確認ね



525 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:23:29 ]
>>457が何でそうなるのか解説求む

526 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:27:01 ]
>>525
>>454


527 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:28:31 ]
globってワイルドカードでも正規表現でもないのか
なんでこんな面倒なもん作ったんだ

528 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:31:15 ]
いや、zshの**を取り込んでるくらいで、
ワイルドカード(UNIXシェルの、だが)だよ。


529 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:31:34 ]
ああ勘違いしてたわ txtだけはじかれてるのかと思った

530 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:32:09 ]
ほぼワイルドカードじゃね?

531 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:32:50 ]
あら遅レス失礼した

532 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:33:41 ]
globにlsコンパチの引数受け付けるようにしてくれ

533 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:34:20 ]
>>532
UNIXで誰がファイル名展開をやってるか知ってるかい?


534 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:44:33 ]
えっ? 誰かがやってるなんてことあるわけないでしょう?



535 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 03:16:47 ]
echo *

536 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 03:27:47 ]
もうshellの機能をrubyに組み込むべきだなw
login shellを/bin/rubyshにできていいかもしれないw

537 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 07:53:49 ]
RubyShell って面白そうだな。
誰も使わないだろうけど。

538 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 07:55:47 ]
RashだかRushってシェルがなかったっけ

539 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 08:46:18 ]
イラネ

540 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 09:30:18 ]
とある人のウェブページに、perlをログインシェルとして使ってみた報告があるぞ。
一度読んでおくといい。

541 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 09:33:51 ]
いやRushが既にあるから

542 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 11:51:29 ]
コマンドライン引数は定数じゃないの?
普通に文字列を代入できるんだけど

543 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 12:01:40 ]
>>542
Rubyの定数は、警告 warning: already initialized constant ARGV
は出るけど代入自体はできる。

あ、あと、 ARGV << 'hoge' なんてのは「定数への代入」じゃないからな。


544 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 12:03:05 ]
$ ruby -e "ARGV=nil"
-e:1: warning: already initialized constant ARGV

いやきちんと定数として警告出ますが

というかただの定数に過ぎない
Rubyはこれを起動時から用意してるだけで、用意したあとは特別扱いをしない
ただの配列を指す定数で、配列としての動作に従う
配列だから、要素を弄る限りはオブジェクトIDが同一で、定数としての適正を失わない

irb> arr = [1, 2, 3]
irb> arr[0] = 'one'
irb> ARGV[0] = 'one'




545 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 12:18:43 ]
代入はできるけど、データのコンテナとして ARGV を使うのはおすすめはしない
ただ、これは

グローバル変数と定数を使う→
クラス変数を使う→
インスタンス変数だけを使う→
全部引数での受け渡しにする→
引数の数が大量になって鬱陶しいのでアクセサメソッド経由のインスタンス変数と引数の併用にする

というような変遷をどうしてもみんな辿るので今はまだ気にしなくてもいいとも言える

546 名前:542 mailto:sage [2010/03/16(火) 12:25:44 ]
とにかくコマンドライン引数には入れるなってことでしょ

547 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 12:47:18 ]
def hoge=
この=って何?

548 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 13:00:04 ]
>>547
そのまんま
「hoge=」 という5文字の名前のメソッド

ただ、末尾に = があるメソッド定義を Ruby は特別に扱うので、引数つきで定義しておいたほうがいい
あと、foo.hoge = と = の前に空白があっても、Ruby はとりあえず foo のメソッドの中から hoge= を探す

foo.set_hoge(v) とするよりも foo.hoge = v と書けたほうがなんかわかりやすくね、という理由で特別扱いされてる

549 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 13:07:59 ]
「プログラミングRuby 第2版 言語編」ですが、今から読むには
古すぎますか?それとも第3版が出て、絶版になる前に読んでおく
べき?

たのしいRuby、Well-Grounded Rubyist、初めてのRuby
は読みました。


550 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 13:08:28 ]
>>548
理解した、ありがとう

551 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 13:16:29 ]
>>548
>「hoge=」 という5文字の名前のメソッド

通常の方法では代入文でしか呼べないから、ただのメソッドではなく演算子定義の一種と見た方がいい

一応引数無しでも定義できるけど__send__使わないと引数なしでは呼べない

552 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 13:17:42 ]
>>551
Rubyの演算子はメソッドですよ

553 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 13:24:32 ]
Rubyのユーザーは学生と暇人が多いのか?
C/C++のスレには全然書き込みが無いんだけど

Rubyは簡単だから、学生に人気があるのかな

554 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 13:29:41 ]
最近質問が多いね、春休みなんじゃないの?
まあ俺も春休みだけど。。



555 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 13:30:46 ]
去年からずっとやすm

556 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 13:31:17 ]
仕事探せ

557 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 13:32:16 ]
>>555
勝った!

558 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 13:33:11 ]
>>557
お前は必死に仕事探せ

559 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 13:35:25 ]
学生と暇人とニートがいないとプログラミング言語は成長致しませぬゆえ

560 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 13:37:43 ]
学生と暇人なんて放っておいても沸いてくるんだから
無職連中はとりあえず生活基盤作れ

561 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 13:39:35 ]
暇な香具師を無料で奉仕させてこそオープンソースだしな。

562 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 14:18:15 ]
>>549
初めてのRuby(yugui本)を読んで自分のものと出来たのなら
好きに進んでいいよ。


563 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 14:43:10 ]
Rubyはいつになったら仕様が固定されるの?
安心して使えない

564 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 14:48:04 ]
1.8 は少なくともあと5年は使えるな。



565 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 15:06:10 ]
>>562
レスどうも。
ツール作りでもしてみます。

566 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 15:08:40 ]
本の内容が新しいかどうかという話なら、新しくはない

1.8.7の1.9新機能入りプログラミングができないというのはなんとも歯痒い
が、それはWebの情報でアップデートできる程度なので問題はなさそうかも
むしろ最初からこれ教えたら混乱しそう

567 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 16:19:22 ]
>>563
固定化されることはないと思う

568 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 16:22:33 ]
>>563はそもそも使わないからどうでもいい

569 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 18:52:28 ]
ちなみに今から使い始めるならどのバージョンがお勧めなんだ

570 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 18:58:53 ]
>>569はテンプレも読まないからどうでもいい

571 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 18:58:54 ]
始めるだけなら 1.8.7 の最新だと思うが、
最新(p249)はString#inspectで最後の多バイト文字が文字化けするという
デバッグや実験中に微妙にイラッとするバグがある。
気になるなら p174 で。
1.9系は夏に1.9.2が出るのでそのときまた判断だな。


572 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 19:16:27 ]
やっと1.9sp2が出るのか。

573 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 19:18:21 ]
それはまだ
1.9正式が出ただけ
sp1が今度出る

574 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 19:22:45 ]
>>571
$KCODE を設定した上で p で日本語を表示しようとした場合に最後の文字がバイト列のままになる


p で日本語を表示しようとさえしなければ問題はないし、俺は表示しようと思ったこともない
というかむしろ p を使うような事態のときは1.9でもデフォルトでバイト列表示しろやわかりにくいわぼけー

どういう日本語を普段扱ってるかで違うんだろうな、このへん



575 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 19:25:49 ]
p の意義からしてエンコーディングを考慮するほうが正当
ShiftJIS 文字列とか表示されて端末乱れるのはイラッとくるが

576 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 19:34:14 ]
オブジェクトを機能拡張するためにモジュールで拡張したんだけど
さらに状態の保持が必要な機能追加がしたくなった
モジュールへの修正じゃ対応できないの?

577 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 19:35:16 ]
require 'Hoge'
include Hoge
なんで、requireにはシングルクォートを付けないと怒られるのに
includeには付けなくても怒られないの?

たまたま、そうなっただけなのかな〜

578 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 19:41:28 ]
>>577
require は基本的にはファイルパス
実際のファイルの大文字小文字が考慮される
(が、あまりにも面倒なのでファイル名の時点で小文字だけにしようという取り決めがある)

include の引数はモジュール名、つまり定数

579 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 19:44:08 ]
>>576
すれば

include はするたびにその順番に機能する

580 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 19:44:15 ]
require 'Hoge' は主ファイル名だからじゃね?

581 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 19:46:41 ]
>>578-580
ありがとう

582 名前:576 mailto:sage [2010/03/16(火) 19:47:24 ]
>>579 (and all)
どうすれば状態を保持できますか?

583 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 19:51:32 ]
状態って何

584 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 19:52:35 ]
>>577
requireも単なる関数的メソッドとして実装されているのも理由の一つ
Hogeというキーワードはrequireの実行を終える前には当然定義されていないし
予約語でもないから、リテラルを使うしか渡す方法(requireメソッドを実行する方法)がない

「Hogeをrequireしろ」「Hogeってなんだ?」
「Hogeを読めばわかる」「だからそのHogeって何だよ」
NameError: uninitialized constant Hoge

Symbolでもよさそうだけどそのへんは>>578なんだろう



585 名前:576 mailto:sage [2010/03/16(火) 20:01:14 ]
もともとのオブジェクト以外に追加の情報を保持したいんですが
たとえば配列クラスに最大値を保持するなど

586 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 20:22:21 ]
>>585
エスパー発揮で

obj = [1,2,3]
obj.instance_eval{ @mymax = self.max }
obj.define_singleton_method(:mymax){ @mymax }
p obj.mymax

なんか頭の悪そうなコードですまん

587 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 20:25:30 ]
>>585
本当にしたいことを書いたほうがいいと思う

include ではクラスにもともとあるメソッドを上書きすることができる
でも、おそらくはそれが解決方法ではないと思われ

組み込みや標準添付のクラスを拡張することは好ましいこととは考えられてない(オープンクラスのくせに)
自分でクラスを作ってインスタンス変数とかにオブジェクトを保持するほうがいい
オブジェクトの操作は自作のクラスのメソッド経由で行う

class HogeData
def initialize(a)
raise ArgumentError, 'must be Array' unless a.kind_of?(Array)
@hogedata = a
end
def <<(e)
return if @hogedata.size > 2
@hogedata << e
end
def data; @hogedata; end
end


irb> hoge = HogeData.new([1,2])
irb> p hoge.data
[1, 2]
irb> hoge << 3
irb> p hoge.data
[1, 2, 3]
irb> hoge << 4
irb> p hoge.data
[1, 2, 3]

588 名前:576 mailto:sage [2010/03/16(火) 21:18:59 ]
では言い直します。
自分で書いたクラスのオブジェクトに追加の情報を持たせるには、
継承したり別のクラスに包含すれば可能だけど、すでにModuleで拡張しているので
そこはできるだけ触らずにModuleに少し書き足す程度で実現できないか?
Module内でインスタンス変数的な情報を保持する何かを定義できないか?

589 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 21:34:12 ]
>>588
よくわからんけどこれでダメ?
ダメならどうダメかをコードとして提示してくれると他の案を言えるかも

module M
end

class C
include M
def foo
@foo
end
end

module M
def bar
@foo = :bar
end
end

obj = C.new
obj.bar
p obj.foo #=> :bar

590 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 21:53:46 ]
>>586
Moduleの使い方・考え方が間違ってるような気がするなあ

あるクラスがModuleをincludeした時点でそのクラスのインスタンスは
存在していないわけだからインスタンス変数を設定したり保持したり
できないでしょ
アクセサの定義ならModuleでもできるけど

module M
 def data
  @data
 end
 def data=(arg)
  @data = arg
 end
end

class C
 include M
end

591 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 21:55:33 ]
591レス目
ズレている人はレスデータの再読み込みをしてください

592 名前:576 mailto:sage [2010/03/16(火) 22:01:45 ]
それだとobj.barを書かなければいけません。
質問は、Module内を書き換えるだけで、外側には一切手を加えずに@fooを初期化できるかということです。

593 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 22:02:14 ]
なにその出来の悪いGUIのリストみたいな現象

594 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 22:04:28 ]
module内でinitialize書き直したら?



595 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 22:08:09 ]
>>594
それはできない

596 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 22:16:53 ]
ほんとにできない?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<211KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef