Ruby 初心者スレッド Part 19at TECH
Ruby 初心者スレッド Part 19 - 暇つぶし2ch404:デフォルトの名無しさん
08/05/04 13:04:58
>>400
この辺はじっそうによるからなあ。
コード書いてみて、実験したりして挙動を確かめる方が身につくよ。
本も大事だけどさ
コード書かないで理解は無理だべさ

405:デフォルトの名無しさん
08/05/04 13:18:59
>>396
まずどういう目的で、何をするためのスクリプトを書いてて詰まったのか
そこを書いた方が回答しやすい

学習目的なら、特異メソッド(Hoge.b)の理解は後回しで良い
それよりも、まずクラスとインスタンスの概念を理解することが先

406:デフォルトの名無しさん
08/05/04 14:10:12
>>405
目的はある処理をするクラスを作っていて、
クラス内部の処理を解りやすくするために、関数で処理を
まとめようとしていました。
色々と処理の分岐があるので、その方が解りやすく書けるからです。
新たにクラスを作るほどは大きくなく、下手に複数のクラスにして
データのやりとりで悩まなくていいし、1ファイルに納めるのに
都合が良いからです。

しかし、メソッドを定義してやると、クラス外からも呼び出せるし、
何か気持ち悪いので良い方法はないのかと思って聞いてみました。

そもそも、クラスの使い方が間違ってるような気もしていたので。

クラスから自身を呼んでインスタンス化するというのも、
自身の、呼び出した部分のコードがメモリに読まれるので、無駄な気がするし。


407:デフォルトの名無しさん
08/05/04 14:57:18
>>401
読んでみます。

>>402
やはりプライベートにして、アクセスを禁止してしまえば良いんでしょうか。

>>403
なるほど。再帰的に呼び出してるわけですよね。
クラスを呼ぶのでクラス指定しないとダメなんですかね。
クラス内だから関数的に呼べるのかなとも思ったんですが。

なんとなくあやふやな感じで理解してましたが。
selfを付けるのと付けないのでどういう違いが
発生するのかいまいちよくわからないのですよね。
selfを付けると、スクリプトの実行時に既に実行可能になってるのか
それとも、クラスが呼ばれたときに実行可能になるのかとか。


>>404
そうですか。あはは。
オブジェクト指向って奥が深いですね。

何か図形的なモデルがあると理解し易いんですが。
きっと複雑な状態遷移があると思うので、
言葉だけではすぐに理解するのは難しいのかなと。


408:デフォルトの名無しさん
08/05/04 15:55:51
説明が漠然としててよく分からんが
Hogeのインスタンスを作っており、なおかつ外部から呼ばれたくないメソッドなら
普通にプライベートメソッドでOK

あとself.bは、クラスメソッドの定義なので
クラスの外でもHoge.bと書けば呼べてしまう
詳しくはリファレンスマニュアル内、「クラスメソッド」の項を参照
URLリンク(www.ruby-lang.org)

409:デフォルトの名無しさん
08/05/04 20:13:44
>>407
すごい大雑把に説明すると、

クラスは鯛焼きプレートでインスタンスは鯛焼き。

def self.foo と定義したものはクラスメソッド。
def bar と定義したものはインスタンスメソッド。

インスタンスメソッドはインスタンスがないと (Hoge.new しないと) 実行できない。
クラスメソッドはクラスが定義されていれば実行できる。インスタンスは不要。

インスタンスメソッドからクラスメソッドを呼ぶのは可能。
def bar
self.class.foo
end

クラスメソッドからインスタンスメソッドを呼ぶには new しないとだめ。

あちこちに self が出てきて分からなくなってきたら p self として確認すればいいんじゃね。

410:デフォルトの名無しさん
08/05/05 15:02:25
PHPのGDに相当するRubyライブラリって何でしょうか?
円や直線など基本的な描画に加えて日本語の出力を行いたいです

URLリンク(d.hatena.ne.jp)
2年前の記事なのですが、現在は何か決定版があるのでしょうか?

411:デフォルトの名無しさん
08/05/05 15:10:40
GDが使いたいならRuby/GD

412:デフォルトの名無しさん
08/05/05 22:40:56
>>408
プライベートで良いんですね。
ありがとうございます。

>>409
なるほど。
selfで呼べば良い訳ですね。

インスタンスメソッドは関数の型宣言みたいなもので、
クラスメソッドは関数みたいな物ですね。

ありがとうございます。

413:デフォルトの名無しさん
08/05/05 23:02:25
あ。違いますね。

インスタンスメソッドは実行時に一つ起動しているオブジェクトで、
スコープの範囲で何時でもどこからでも呼べる。
クラスメソッドは宣言してからようやく使えるメソッドですね。

オブジェクトの起動タイミングが違うという理解でしょうか。


414:デフォルトの名無しさん
08/05/05 23:33:54
>>413
かなり致命的に理解を間違っているようなので
このスレで聞くよりも、身近なプログラマに直接質問してみることを薦める
もしくはGoogleで、オブジェクト指向について基礎から解説してるページを探すとか

415:デフォルトの名無しさん
08/05/05 23:43:24
>>413
1.私は万年筆が好きだ
2.私はこの万年筆が好きだ

この二つのうち、1は万年筆というもの、2は具体的な品を指してるだろ
オブジェクト指向では1がクラス 2がインスタンス
ここで.色関数を考えると、
(2の意味の万年筆).色 ってのは、具体的な品だからちゃんと色が決まってる
これがインスタンスメソッド
(1の意味の万年筆).色 だと、色が決まらないから、クラスに対してインスタンスメソッドは
呼び出せない

同様に、そのものの種類を返す関数 .kind があったとする
このときは、(1の意味の万年筆).kind で、"万年筆"って文字が返ってくるし
(2の意味の万年筆).kind でも、同じように"万年筆"って返ってくる
これがクラスメソッド

416:デフォルトの名無しさん
08/05/06 01:09:00
>>415

> (2の意味の万年筆).kind でも、同じように"万年筆"って返ってくる
> これがクラスメソッド

これは違うんじゃ...

417:デフォルトの名無しさん
08/05/06 01:11:19
比喩でクラスとメソッドの関係を説明しようとするのがそもそも間違いだな

418:デフォルトの名無しさん
08/05/06 12:06:22
つまり、既に初期化されている(スクリプトを読んだ時点で)のがクラスメソッドで、
インスタンスメソッドはnewなどして、その時点にならないと
初期化されないメソッドという事じゃないんですか?


419:デフォルトの名無しさん
08/05/06 12:35:38
Rubyではクラスもオブジェクト。
Rubyではオブジェクト毎にメソッドを定義できる。
クラスオブジェクト(Classクラスのインスタンス)にメソッドを定義したのがクラスメソッド。
そのクラスのインスタンスとは直接は関係しないから、クラスメソッドを定義しても、インスタンスメソッドには影響しない。


420:デフォルトの名無しさん
08/05/06 12:47:26
irb> class C ;def C.clsmtd; p self.object_id; end ;end
irb> C.clsmtd
537963320
irb> p C.object_id
537963320
irb> p C.new.object_id
537887540


421:デフォルトの名無しさん
08/05/06 13:09:22
>>418
どうもインスタンスメソッドに関して、誤解があるように思えるな

foo_instance = Foo.new # オブジェクトの生成
foo_instance.a(1, 2) # foo_instanceのメソッドaを実行し、結果を返す
a(1, 2) # エラー

このスクリプトでなぜエラーが出るのかは理解できる?

422:デフォルトの名無しさん
08/05/06 14:41:55
では、クラスは何処にあるんですかね?
インスタンス化されたクラスは?
場所の定義は無いんですか?


423:デフォルトの名無しさん
08/05/06 15:13:18
Rubyがどうかは知らんが、よく用いられるモデルで説明してみる
class A
@a
@b
@c
end

instance = A.new は、C言語でいえば、void *instance = malloc(3);
この3はAに変数が三つあることに対応してて、このケースならinstance[0] が @a ,instance[2] は@cに対応してる

例えばここにインスタンスメソッドとして
def set_a(new_a)
@a = new_a
end
があったとする。
instance.set_a("test")のように呼び出すと、内部ではset_a(instance,"test")と変換される
実際に呼ばれる関数は、C言語で書けば
void set_a(instance , new_a)
{
instance[0] = new_a;
}

こんな風に、@aなりを使ってると、listのアドレスを確定させなきゃならんから
具体的なインスタンスに対してしか使えない

クラスメソッドは、Cでいうところのグローバル変数のみを使ってる関数で
イメージ的には
int num = 10;
int class_num() { return num; }
に対応する。
この場合は変数instanceをメソッド内で使ってないので、A.class_method でもいいし instance.class_method
でもおk

424:デフォルトの名無しさん
08/05/06 15:16:52
訂正
>line23 listのアドレスを→instanceのアドレスを
>line29 int class_num() ⇒ int class_method()

425:デフォルトの名無しさん
08/05/06 18:26:27
>>422
定義されたクラスは、定数として存在している

class Foo
 (ここにメソッドとかの定義)
end

print Foo.name # "Foo"が出力される
print Foo.class.name # "Class"が出力される

426:デフォルトの名無しさん
08/05/06 18:46:53
Rubyではクラスもインスタンスもオブジェクトで、実体はオブジェクトスペースに存在してるよ。
それらに名前をつけたのが変数や定数。
変数や定数は実体がオブジェクトスペース内のどこにあるのかの情報を持ってる。

427:デフォルトの名無しさん
08/05/06 19:45:36
『プログラミングRuby』にもそんな感じの章があるよ
構造体、メモリ、ポインタで説明してほしい人は
読んでみると何かしら得るものがあると思うんだ

URLリンク(www.ruby-doc.org)

ここの図が良いんだけどFigure not availableになってるのが残念

428:デフォルトの名無しさん
08/05/06 22:05:52
rubyでオブジェクト指向理解しようなんて無理でしょ
遠回りだけどjavaをしっかり勉強した方がいいじゃないの?

429:デフォルトの名無しさん
08/05/06 22:10:44
Javaのオブジェクト指向はオブジェクト指向なJavaでしかないと思うんだ

430:デフォルトの名無しさん
08/05/06 23:32:46
オブジェクト指向を理解するという文脈でJavaを第一に持ってくる
ってことは理解してないってことだよな。


431:デフォルトの名無しさん
08/05/07 00:09:23
ていうか
Rubyのクラスとインスタンスとメソッドを理解したいのか
オブジェクト指向プログラミングのクラスやインスタンスを理解したいのか
どっちかにして欲しい
後者ならスレ違いだ

432:デフォルトの名無しさん
08/05/07 00:55:34
>>430
オブジェクト指向を学ぶ上でJavaより勉強する価値のある言語って何?
批判するだけで自分の考えは何も無いの?

433:デフォルトの名無しさん
08/05/07 00:57:09
Smalltalkあたりじゃないかな。

434:デフォルトの名無しさん
08/05/07 00:57:26
smalltalkじゃね?

435:デフォルトの名無しさん
08/05/07 00:57:55
有名なのはSmalltalkかな

436:デフォルトの名無しさん
08/05/07 00:59:01
Smalltalkだろ。


437:デフォルトの名無しさん
08/05/07 00:59:26
Smalltalkだな

438:デフォルトの名無しさん
08/05/07 01:00:25
smalltalkがjavaより勝ってるものって何?

439:デフォルトの名無しさん
08/05/07 01:05:34
純粋さ

440:デフォルトの名無しさん
08/05/07 01:06:56
おっと無能の数はjavaには敵いませんな

441:デフォルトの名無しさん
08/05/07 01:06:57
2chは知ったかばかり

442:デフォルトの名無しさん
08/05/07 01:11:16
オブジェクト指向の学習用として考えるなら、だいたいどれも大差ない
C++でもRubyでもPythonでもJavaでも
(smalltalkは使ったことないから知らないが)

443:デフォルトの名無しさん
08/05/07 01:11:46
>>438
というかJavaは、意図的に完全なオブジェクト指向にしてない
実用面ではどうかってなるとまた別の話になるんだが、
少なくともオブジェクト指向って観点から見ると美しくない

逆にSmalltalkは文字通り全部がオブジェクト
制御構造すらオブジェクトのメッセージ扱いになる
RubyもSmalltalkからメタクラスとかの概念をもらってるはず

444:デフォルトの名無しさん
08/05/07 01:12:09
smalltalkがjavaより勝ってるものって何ですか~?

445:デフォルトの名無しさん
08/05/07 01:15:03
じゃあどうしてデザインパターンの書籍の多く(専門書も含めて)はJavaを元に書かれてるんだ?

446:デフォルトの名無しさん
08/05/07 01:16:28
JavaはOO貫徹をあきらめてAlgol系並の実用性を手に入れたようなもんだからな。


447:デフォルトの名無しさん
08/05/07 01:17:39
>>445
最初のGoFはSmalltalkだったぞ。
のちにJava優勢になったのは普及度の違い。


448:デフォルトの名無しさん
08/05/07 01:18:33
>>445
オブジェクト指向をよりよく体現してる=言語として人気がある とはならないだろ
どっちにしろJavaで上手い設計してる奴はSmalltalkから来てるよ

449:デフォルトの名無しさん
08/05/07 01:20:16
Javaスレッドで前にも見たような流れだな
少なくとも実用的な言語を元に学ぶのが良し、という考え方の元ではJavaだろう
Smalltalkでオブジェクト指向を学べってのは大げさ過ぎる

450:デフォルトの名無しさん
08/05/07 01:20:46
>>445
実用を兼ねてるんだろう
Java使ってる人は多いだろうし、JavaはC++やC#とかとも文法が似てる

・・・・・と言いつつ、GoFのデザパタ本はSmalltalkも使ってたような

451:デフォルトの名無しさん
08/05/07 01:21:40
smalltalkってそんなに完成された言語だったの??

452:デフォルトの名無しさん
08/05/07 01:22:22
つかなんでいきなりデザインパターンみたいな応用が出てくるんだ
もともとの問題を摩り替えないほうがよい

453:デフォルトの名無しさん
08/05/07 01:25:46
Javaで学べっていっても初心者的には構文覚えて精一杯じゃないか
自分でいい設計してるソース探してきて読むとこまで勉強するよりは
Smalltalkのライブラリでも読んでりゃいいとは思う

454:デフォルトの名無しさん
08/05/07 01:26:16
GoF本は最初のバージョンはSmalltalkとC++でサンプルが書かれてる。
もともとSmalltalkで得られた知見だしな。

新しい版はJavaコードも使ってる。


455:デフォルトの名無しさん
08/05/07 01:27:35
>もともとの問題を摩り替えないほうがよい
Smalltalkに噛み付く奴はスレ逸らしだろうな

456:デフォルトの名無しさん
08/05/07 01:27:46
OOを覚えるためにはやはりEiffelしかないだろ

457:デフォルトの名無しさん
08/05/07 02:00:12
Eiffelもやっとくべきだと思いつつまだ入門もしてないだよなー。



458:デフォルトの名無しさん
08/05/07 06:09:55
なんというか>>400読んで、
ちょっと前に本スレにいた京大君を思い出すんだよな(本人だと言うわけではなく)。
んで、実際のところ質問者はCとかでは、コードをすらすら書けるんだが、
「オブジェクト指向」(または、Rubyのモデル)の概念でつまづいてコードが書けないのか。
それとも計算機の理論を一通り座学して、これからコードを書くに当たって、
(Cではなく)楽ちんそうなオブジェクト指向スクリプト言語を選んだのか。
前者と後者で、かなりすべき対応が変わると思うんだが。

459:デフォルトの名無しさん
08/05/07 07:26:35
Javaは非オブジェクトな型をあえて残した言語だからな
OOPLとしては、普及してるが純粋でない。

460:デフォルトの名無しさん
08/05/07 10:24:48
Smalltalk が Java や Ruby より圧倒的に勝っているところをひとつ挙げるとすれば
リフレクションとかに代表されるイントロスペクション機能でしょうね。
分かりやすいところでは、IDE やデバッガなどの機能充実度や、それらの
作りこみやすさに出てくる特徴です。もとは LISP 譲りの機能ですが、Smalltalk での
充実度は LISP をも凌駕しています。これは Smalltalk 処理系が Smalltalk 自身で
記述されている(記述可能…とかではなく、実際にそれで運用されている)ことに
由来します。

Ruby 実装では Rubinius や今度の RailsConf でデモされる予定の MagLev が、
現在の制約を克服して Smalltalk に近づこうと努めているみたいです。
これらは Smalltalk と同じく、Ruby 処理系をできるだけ Ruby で記述しようとする
ものたちです。

あと余談ですが Java は、Ruby や Smalltalk などの「メッセージングのOO」という
パラダイムに則していないだけで、C++ や Eiffel などの「ユーザー定義型のOO」と
いうパラダイム的にはかなり純粋なほうですよ。念のため、後者は“ユーザー定義型”を
クラスで実現しようとする考え方で、メッセージのやりとりとかとは無関係です。

裏を返せば、Ruby や Smalltalk は、Java の土俵である「ユーザー定義型のOO」的な
切り口で見たときに、足りないところが多々あるということになり、実際にそうなっています。

461:デフォルトの名無しさん
08/05/07 10:54:06
Smalltalk まで読んだ

>>458
ぶちゃけた話、オブジェクト指向を完全理解しなくてもRubyのクラスやメソッドは使えるよな
継承や委譲もなんとかなると思う

462:デフォルトの名無しさん
08/05/07 12:36:37
>>458
オブジェクト指向が分からないのか、
Rubyでのオブジェクト指向を実現する技法が分からないのかでも話が変わってくるのでは
オブジェクト指向って思考法そのものは言語に依存しないと言われているし

463:デフォルトの名無しさん
08/05/07 13:02:54
関数は (関数 引数 引数) 見たいな記述でもキモいって言われないのに
オブジェクトは メソッド(オブジェクト 引数 引数) だとキモいって言われるのはどうして?

464:デフォルトの名無しさん
08/05/07 13:16:56
どのくらい言われてるかはわからないけど、あるとしたら、多重定義の関係じゃない?
「呼び出し先の決定権を持っている奴」が、端っこではない場所に居て、やや目立ちにくい
・・・という、ビジュアル的な違和感ではないかと思う。

結局のところ、慣れればそれまでって気がするけどね。

465:デフォルトの名無しさん
08/05/07 13:18:40
第1引数を太字でシンタックスハイライトすれば解決
いやわりとマジ

466:デフォルトの名無しさん
08/05/07 15:18:42
すごく初歩的な質問なんですが、

puts "あなたの名前は?"

name = gets.chomp

puts "あなたの名前は#{name}です"

これを実行しても

dan(←入力数値)
あなたの名前は?
あなたの名前はdanです

となって文字列の出力するタイミングが意図したものにならないんです^^;
どうすればいいのでしょうか?
ちなみに開発環境はRDEを使っています。

467:デフォルトの名無しさん
08/05/07 15:27:17
$stdout.sync = true

puts "あなたの名前は?"
name = gets.chomp
puts "あなたの名前は#{name}です"


468:デフォルトの名無しさん
08/05/07 15:44:27
smalltalkerって名前の割によく喋るね

469:デフォルトの名無しさん
08/05/07 15:47:15
>>467さんありがとう!できました^^

470:デフォルトの名無しさん
08/05/07 20:38:45
>>464
関数に見えるというのが。フラットな名前空間にとっちらかる感じで。
名前空間を導入すると今度は対象がわかってるのに名前空間を書かないといけないのがあれで。
……まあ結局は気分なんだが。CLOS がやっていけてるんだからやっていけるんだろう。

471:デフォルトの名無しさん
08/05/07 21:55:06
>>463
> オブジェクトは メソッド(オブジェクト 引数 引数) だとキモいって言われるのはどうして?

C言語でオブジェクト指向で書くとそんな感じだから、別にキモいとは思わない。

472:デフォルトの名無しさん
08/05/07 21:56:37
>>463
メソッドチェーンができないから

473:デフォルトの名無しさん
08/05/07 22:51:46
smalltalkとオブジェクト指向の話面白そうだなぁ
誰かスレッド作ってくれんかなぁ

474:デフォルトの名無しさん
08/05/09 09:36:58
cgi で画像を並べたいんだけどどんなふうに書けばいいの?
つまりはこういうソース吐きたいんだけど

<div>1 2 3 4 5</div>
<div>6 7 8 9 10</div>

or

1 2 3 4 5<br>
6 7 8 9 10<br>

or

<div>1 6</div>
<div>2 7</div>
<div>3 8</div>
<div>4 9</div>
<div>5 10</div>

あとオプション1つでテーブルタグも吐けたりするとうれしいな

475:デフォルトの名無しさん
08/05/09 11:06:53
まあとりあえずは自力で配列内容を表示させる勉強しろ
手を抜くより先に覚えることはたくさんある

「自分で作れるけどもうめんどいから他のことに時間かけるために手を抜く」
というのが正しいプログラミング

メソッドを作ることはできるかな
できないのなら作り方おぼえるといい

476:デフォルトの名無しさん
08/05/09 11:22:11
引っかかる点は何だろう
「カウント○ごとに何かをする」という専用の処理が何かあると思うことかな
ありそうだけど無いよね
each_with_index で回して index + 1 の 剰余5 が 0 のとき何かする、という記述しかない?

477:デフォルトの名無しさん
08/05/09 13:13:18
each_sliceともちょっと違う?


478:デフォルトの名無しさん
08/05/09 18:07:17
def group_by
  hash = {}
  each do |item|
    key = yield(item)
    (hash[key] ||= []) << item
  end
  hash.collect {|key, arr| arr }
end
こんなメソッドって標準になかったっけ?

479:デフォルトの名無しさん
08/05/09 20:01:55
Enumerable#group_byは1.9と1.8.7だけかな?
もっとも、Hashのままで返すけど。
というか>>478のだと、どのグループかわからなくなるんじゃないか?

480:デフォルトの名無しさん
08/05/09 20:03:15
> hash.collect {|key, arr| arr }
hash.values


481:デフォルトの名無しさん
08/05/09 21:16:18
>>479,480
さんくす
そうだよな、Hash#values があるじゃん
なんて間抜けなんだ

482:デフォルトの名無しさん
08/05/10 14:38:43
rubyを最近習い始めたのですが、
1からキーボードで入力した数までの和をもとめる
プログラムの作り方がいまいちわからないのですが
教えていただけませんでしょうか?


483:デフォルトの名無しさん
08/05/10 14:40:53
すいません、スレ違いでした。
スルーしてください

484:デフォルトの名無しさん
08/05/10 14:54:50
>>482
def sum(n);n*(n+1)/2;end

485:デフォルトの名無しさん
08/05/10 15:58:44
>>484 が良い解だと思うけど、Ruby的には
def sum(n); (1..n).inject{|a,b|a+b}; end
という風にできることを知っていると後で役に立つかも。
立たないかも。


486:デフォルトの名無しさん
08/05/10 18:37:59
似たような演算を多数作るなら、以下のように。
ただし>485の5倍程度の時間がかかる。(毎回evalのため)

def fn_maker(fn,lst);lst.inject{|r,i|eval("r"+fn+"i")};end

def summerise(x);fn_maker("+",x);end
def multiple(x);fn_maker("*",x);end
def divide(x);fn_maker("/",x);end
def subtract(x);fn_maker("-",x);end

def sum_1_to_n(n);summerise(1..n);end

p sum_1_to_n(10)

a=[3.0,5,2]
p summerise(a)
p multiple(a)
p divide(a)
p subtract(a)

487:デフォルトの名無しさん
08/05/10 18:54:07
send使えよ

488:デフォルトの名無しさん
08/05/10 19:15:48
つか初心者スレっぽいな

489:デフォルトの名無しさん
08/05/10 19:43:59
>>482に対して>>484-486を持ち込むあたりいかにも初心者だな
微笑ましい…のか?

490:デフォルトの名無しさん
08/05/10 19:50:19
入力をどう扱うかも示さないと回答として片手落ちだしな

491:デフォルトの名無しさん
08/05/10 20:05:25
というか初心者スレとしては普通に回答するか解説つきで説明すべきなんだがね
自分の知識の結果をただ披露して悦に入ってどうするよ

492:デフォルトの名無しさん
08/05/10 20:07:48
YARVで、あるベンチマークが
* 「100%速くなった」というのは、時間が半分になったということ?
* 「200%速くなった」というのは、時間が1/3になったということ?
* 「25%速くなった」というのは、時間が20%減ったということ? ( 1 / (1-0.20) = 1.25 )
教えてえらいひと。


493:デフォルトの名無しさん
08/05/10 20:17:30
自己嫌悪はそこまでにして、次w

494:デフォルトの名無しさん
08/05/10 20:23:19
>>482

数値から数値までを足すときはガウスが少年時代に行った
計算方法を利用してプログラムを作った記憶が有るなあ
1~aを計算するとして
aが偶数なら(1+a)*(a/2)
aが奇数なら最初にa+1に対して上と同じ計算をして最後にa+1を引くように
すれば簡単に計算できた記憶が有る
例えば
a=10(偶数)ならば
(1+10)*(10/2)
a=11 (奇数)ならば
i=a+1
(1+i)*(i/2)-i
と場合分けすると式が短くて簡単


495:デフォルトの名無しさん
08/05/10 20:44:11
>>494
なるほどね。
他の方法で暗算だとa,a+1のうち、偶数になる方を2で割ってから掛け合わせたりする。
例:
1~100の場合、100*101/2 = (100/2)*101
1~123の場合、123*124/2 = (124/2)*123

以上は経験的に「奇数の1/2 * 偶数」よりも「偶数の2/1 * 奇数」の方が
暗算しやすいからだけど、プログラムにも活かせると面白いかも。
例えば、少量データで早い実装、大量データで早い実装のように複数の関数を
用意しておいて、稼働状況に応じて使う関数を自動的に切り替える。

496:デフォルトの名無しさん
08/05/11 11:38:08
str0 = "bar"
の時、マニュアルによると
p str0[3, 1] #=> nil
らしいですが、自分の環境(1.8.6 mswin32)では""が返ってきます
何が悪いのでしょうか

497:デフォルトの名無しさん
08/05/11 11:54:30
'bar'[2, 1] #=> 'r'
'bar'[3, 1] #=> ''
'bar'[4, 1] #=> nil

本当だ。なんかバグっぽい挙動だな

498:デフォルトの名無しさん
08/05/11 16:47:40
fw(findwordの略)というプログラムを作ろうとしています。

fw -fp '/usr/include/**/*.h' '~/**/*.h' -wp 'define\s+\w+' -pp '%1 %2 %3'という感じで
-fp の後ろに複数のファイルパターンを
-wp の後ろに複数の単語パターンを
-pp の後ろに表示用のフォーマットを指定できるようにしたいのですが、optparseをうまく操れません

上記の実行例だと
["/usr/include/**/*.h", "~/**/*.h"]
["define\\s+\\w+"]
と表示されて欲しいのですが、実際は
["/usr/include/**/*.h", "~/**/*.h"]
["define\\s+\\w+", "%1 %2 %3"]
と表示されてしまいます

printpattern = "%1:%2:%3" # filename:linnum:line
print = proc {|filename,linenum,line|
 STDOUT << (printpattern %filename %linenum %line) << "\n"
}
filepatterns = []
wordpatterns = []
ARGV.options {|opt|
 dest = wordpatterns
 opt.on('-fp' , '--filepattern')       { dest = filepatterns  }
 opt.on('-wp' , '--wordpattern')       { dest = wordpatterns  }
 opt.on('-pp S' , '--printpattern S' , String) {|s| printpattern = s  }
 opt.order! {|s| dest << s }
 p filepatterns
 p wordpatterns
}


499:デフォルトの名無しさん
08/05/11 18:00:07
正規表現に完全にはマッチしてないのだけど、あと数文字付け加えてくれたら
完全にマッチするみたいのを検出したいのですが、いい方法はないでしょうか?

500:デフォルトの名無しさん
08/05/11 18:05:01
>>498
ショートオプションはアルファベット一文字のみ
あと質問にはないが、(printpattern %filename %linenum %line) はRubyでは動かない

501:デフォルトの名無しさん
08/05/11 18:31:50
>>499
そのあと数文字を付け加えてない状態を正規表現で表せばいいんじゃない?
もっと具体的にやりたいことの例を出してみれ
解決策が出てくるかもしれないよ

502:498
08/05/11 19:53:16
>>500
ありがとうございます。 一文字にしたらうまくいきました。
フォーマットは"%1$s:%2$s:%3$s" %[filename, linenum, line]でいけました

>>501
499も実は私なのですが、498のプログラムのwordpatternに複数行にも
マッチする正規表現を指定できるようにして、それでいて表示にファイル名と行番号も表示できるようにしたいです
re = /なんか正規表現/
linenum=1
curtext=nil
IO.foreach(path) {|line|
 if nil==curtext
  curtext=line
 else
  curtext+="\n"+line
 end

 if 途中までまっち
  linenum+=1
  next
 else if 完全まっち
  print.call(path,linenum,curtext)
 else
  curtext=nil
 end
 linenum+=1
}

503:498
08/05/12 00:17:51
できたー とりあえず動いてるっぽいです
#!/usr/bin/env ruby
require 'optparse'
if $0 == __FILE__
 printpattern = "%1$s:%2$s:%3$s" # filename:linnum:line
 print = proc { |filename,linenum,line| STDOUT << (printpattern %[filename, linenum, line]) << "\n" }
 filepatterns = wordpatterns = []
 ARGV.options { |opt|
  dest = wordpatterns
  opt.on('-f'  , '--filepattern')  { dest = filepatterns }
  opt.on('-w'  , '--wordpattern')  { dest = wordpatterns }
  opt.on('-p S' , '--printpattern S') {|s| printpattern = s }
  opt.order! { |v|
   if wordpatterns.__id__ == dest.__id__ v = eval(v) end; dest << v
  }
 }
 wordpatterns << /\n/
 re = Regexp.union(*wordpatterns)
 text = ''
 filepatterns.each { |filepattern|
  Dir.glob(filepattern) {|filepath|
   next if !File.file?(filepath)
   linenum = 1
   text = IO.read(filepath)
   text.scan(re) {|m|
    linenum += $~[0].count("\n")
    print.call(filepath, linenum, m) if "\n" != $~[-1]
   }
  }
 }
end

504:デフォルトの名無しさん
08/05/12 02:46:36
>>503
>  filepatterns = wordpatterns = []
>    if wordpatterns.__id__ == dest.__id__ v = eval(v) end; dest << v

filepatterns も wordpatterns も同じだろ、これ。


505:498
08/05/12 07:55:20
filepatterns = []; wordpatterns = [] にしますた

506:デフォルトの名無しさん
08/05/12 19:23:13
perlの基礎的なスクリプトをたくさん公開しているサイト(KENT WEBみたいな)はいくつかありますが、
rubyのこのようなサイトはないのでしょうか?

今までperlで改造を行っていたのですが、
研究室でrubyを使うことになったので勉強ついでに乗り換えようと思ったんですが…

507:デフォルトの名無しさん
08/05/12 19:24:38
python使った方がいいと思うよ。

508:デフォルトの名無しさん
08/05/12 19:45:57
…そーいえば無いな
あれは日本のperl(というかCGI)の黎明期に乗ったサイトだから仕方ないか
PHPにも無いわけだし問題ないかもしれん

>>506
研究室で必要な部分だけ習うだけにしておいたほうがいいぞ

509:デフォルトの名無しさん
08/05/12 19:48:34
>>506
今まで見た事はないな
そもそも「rubyでCGI」自体がかなりマイナーだから
CGI前提のスクリプトも数えるほどしかない

Web上の解説記事や書籍を頼りに、自力で何とかするのがいいと思うよ
もしくはCGIスクリプトに関してはperlに頼るか

510:デフォルトの名無しさん
08/05/12 20:36:12
ありがとうございます。やはり無いですかー…
CGIに関しては今まで通りperlで作ることにします。

511:デフォルトの名無しさん
08/05/12 20:43:02
何かの言語でCGIが作れるようになったらあとは言語問わずに作れるはずだけどね。


512:デフォルトの名無しさん
08/05/12 21:03:26
CGI作るなんてネットワーク技術者か?それともHTTPD製作者かよ?

>>506
本ならたくさんあるよ。Ruby CGIでググれ。
ただ、ほとんどPerlと一緒だから面白みはないけどね。
動いてるruby-webアプリなら、tdiaryとかbitclustのソース読むとかしてみれ。

513:デフォルトの名無しさん
08/05/12 21:55:35
>>512
tdiaryのソースはおすすめせん。bitclustなら許す。

514:デフォルトの名無しさん
08/05/12 22:22:38
鯖管としてはRuby CGIは止めて欲しい。

515:デフォルトの名無しさん
08/05/12 22:34:28
>>514
何故に

516:デフォルトの名無しさん
08/05/12 22:34:34
まあRubyに限った話じゃないだろうけどね
自作CGIなんて動かして欲しくはないわな

517:デフォルトの名無しさん
08/05/12 23:05:41
日本ならtd/hiki動かしてる人はたくさんいるだろう。まあ、railsでtypoをとか
言われたら断りたくなる気持ちはおいらも分かるけど。
その辺はruby1.9/rails3あたりで解決してるといいなあ。

518:デフォルトの名無しさん
08/05/12 23:47:59
class Object
 def tac
  yield(self)
 end
end

[[1,2],%w[sys cpu]].tac{|src|src[0].zip(src[1])}.tac{|src|Hash[*src.flatten]}
=> {1=>"sys", 2=>"cpu"}

このtacに相当する標準のメソッドってありますか?教えてください

519:デフォルトの名無しさん
08/05/13 00:14:59
同じではないがtap
Ruby1.9のメソッドだったがプレビュー版1.8.7にも入ってる
おそらく次の安定版Rubyでは標準で使えるだろう

520:デフォルトの名無しさん
08/05/13 00:23:45
配列の配列をハッシュに変換する方法、という意味かもしれない

そういえば、なんで標準で「一気にハッシュに変換・登録」ができないの?

521:518
08/05/13 00:30:14
>>519
一時変数を使わずにlispみたいにゴリゴリ書ける方法は無いかなぁと思って
tapを参考に作ったんですが…
標準には無いってことですか

522:デフォルトの名無しさん
08/05/13 00:35:47
>>520
キーにまつわる標準的な例外考えるのめんどくさいんだと思う
[[1,'one'], [1,'いち']] が {1 => 'いち'} になったらやっぱ例外出すべきだよな、とか

523:デフォルトの名無しさん
08/05/13 01:05:51
Hash[*[[1,2],%w[sys cpu]].transpose.flatten]

524:デフォルトの名無しさん
08/05/13 01:27:19
WxRuby2についての質問です。

RubyGemsを使って、wxruby-1.9.6-x86-mswin32-60をインストールしたのですが
付属のサンプルを実行しようとすると、wxruby2.soの読み込みで
「lib/wxruby2.so: 126: 指定されたモジュールが見つかりません。」
と言われてしまいます。何か他に、インストールが必要なものがあるのでしょうか?
(WxWidget2.8.7をインストールしてみても、やはり同じエラーが出ました)

OS: Windows XP
ruby: 1.8.6 [i386-mswin32]

525:デフォルトの名無しさん
08/05/13 10:32:09
>>524
> (WxWidget2.8.7をインストールしてみても、やはり同じエラーが出ました)
PATH通してある?

526:デフォルトの名無しさん
08/05/13 12:34:47
1.9.7が出てるようだから試してみるといいかもしれない
ただVC8でコンパイルされてるからまずそうな気もする
wxruby-1.9.6-x86-mingw32.gemをダウンロードして入れる方が楽かも

527:524
08/05/13 17:54:03
mingw版をインストールしたら普通に起動できました(WxWidget無しで)。
助言ありがとうございました!

ちなみに1.9.7は、次のようなエラーでgemのインストールすらできませんでした。

rake (RUBYLIB等の位置を指定するオプション) extension
rake aborted!
Don't know how to build task 'extension'

528:デフォルトの名無しさん
08/05/13 18:27:40
Rubyの初心者にたいして「これは読むべき」だと思うコードを教えてください。
URLリンク(q.hatena.ne.jp)

定番回答らしい回答が即っと無いのが現状をよく表しておるのう

529:デフォルトの名無しさん
08/05/13 18:56:41
たった6時間前に登録された質問じゃん。
青木さんのコードとか、Pickaxeのコードとかいくらでもあるでしょ。

530:デフォルトの名無しさん
08/05/13 20:04:07
真面目に答えようとすると難しそうだな
それにしてもRubyに限らず定番回答なんて存在するのか?
知ったか的なのならいくらでも挙がりそうだが

531:デフォルトの名無しさん
08/05/13 20:19:10
net/pop.rbとかはどうだろう。
POPはプロトコル自体も小さいし。

初心者に800行近いのは無理か・・・

mailread.rbはたしかに短いけど、initializeにいっぱい詰めるのは好きじゃないんだよなあ
完全に漏れの好みの問題なんだけどさ。

532:デフォルトの名無しさん
08/05/13 20:39:39
ここにぁるRubyのコードゎ
とっても勉強になるょ><
初心者なら全部読んでこんなコードを書くくせをつけたほうがいいょ><

URLリンク(golf.shinh.org)

533:デフォルトの名無しさん
08/05/13 21:49:26
コードなんて動けばいいんだよ
こういうコードを書くべき、なんてどんだけ
上から目線なんだよ

534:デフォルトの名無しさん
08/05/13 21:50:56
まったくプログラムできないんだけど、Rubyを始めてみようかと思ってる。
理由は名前がかっこいいのと日本の方が作ったということで分かりやすいのかなぁと思ったことから。
ただ理由がこんな感じだから、勉強しててもただやり方を覚えるだけの作業のような気がしてならない。
何か作りたい物があれば、そのために勉強していけると思うんだが。

みなさんがRuby(プログラム)を始めたきっかけってなんですか?

535:デフォルトの名無しさん
08/05/13 21:51:00
今から餌撒きかー
頑張れよー

536:デフォルトの名無しさん
08/05/13 21:52:51
Rubyを止めたきっかけはPythonでいいと思ったから。

537:デフォルトの名無しさん
08/05/13 22:01:35
>>534
CGI書くときにPerlが嫌で、他の言語を探してたらRubyに当たった

とりあえず、書籍読むなり誰かが書いたコード読むなりして
自分に合いそうだと思ったら始めてみたらいい
目的が欲しいなら、CGIスクリプトか自分用のファイル処理スクリプトでも書いとけ
ゲームが作りたいならそれを目標にしても良い

538:デフォルトの名無しさん
08/05/13 22:06:35
>>534
プログラムを始めたきっかけ: 情報工学部に入ったから
Rubyを始めたきっかけ: Perlになんとなく嫌気がさしてたときに、研究室の先生にRubyをすすめられたから


539:デフォルトの名無しさん
08/05/13 23:27:38
Rubyを始めたきっかけ: 昔いた会社の社長が気まぐれでMatz本買ってきてRubyおもろいと言いだした
Rubyを使うようになったきっかけ: 256本邪道編読んでOfficeだのをいぢりだしてから

540:デフォルトの名無しさん
08/05/14 00:22:41
>>519
>>518 を見てそれ tap じゃんて思ったんだけど、
tap って self を返すんだっけか?

541:デフォルトの名無しさん
08/05/14 01:08:17
selfを返す。
途中に挟んで(ワイヤタップして)、何事もなかったようにメソッドチェーンが進む。


542:デフォルトの名無しさん
08/05/14 01:55:51
>>534
Perlでの「もっと普通にプログラムかかせろ!」という不満から。
ベターPerlから入ったが、今はPerlとは全然違うものと感じている

543:デフォルトの名無しさん
08/05/14 12:33:33
Rubyだけしか知らないつまらない人間にならないために必要な言語ってなんですかね

544:デフォルトの名無しさん
08/05/14 12:41:12
>>543
Python
Scheme(かGauche、なんでもいいからLisp処理系)
Haskell

この3つ
あと基礎素養としてのCな

Perl5とPHP5は身近に使う機会があるならそっち憶えてもいいかと
JavaやVisualCやC++や.net関連は仕事で必要なら勉強させられるし
仕事で使わないのなら自分から憶える必要は全くないのでスルーでOK

日本語とか英語とかそういう自然言語のレスがあると予想

545:デフォルトの名無しさん
08/05/14 12:52:41
SchemeというかGaucheは今ちょっと勉強してる
let を元にして let* と fluid-let と letrec というのを作った奴はどうかしてる
もう少しわかりやすい説明的名称にするか全く新しい名前を付けるべき

546:デフォルトの名無しさん
08/05/14 13:19:45
>>543
Rubyをきちんと学んでればそうそう変なことにはならないはず
再帰とか継承とか本当にきちんと理解した?
Rubyで憶えられないのに他の言語に手を出したって無駄だぞ?

547:デフォルトの名無しさん
08/05/14 14:02:07
C系記法の言語を1個覚えると応用が利く。

548:デフォルトの名無しさん
08/05/14 14:06:14
>>547
初心者スレっぽい

549:デフォルトの名無しさん
08/05/14 14:28:57
漏れもCがいいと思うよ。
拡張も作れるし。

550:デフォルトの名無しさん
08/05/14 16:22:05
Lisp系は解るがPrologは本気で解らん
カットで詰まった俺

551:デフォルトの名無しさん
08/05/14 21:20:32
CつーのはALGOL系の何かということなのか、
グルーピングに{}を使う言語程度の意味でいいのか。


552:デフォルトの名無しさん
08/05/14 21:35:24
記法ウンタラ言う人は無視しておk

553:デフォルトの名無しさん
08/05/15 19:54:36
>>544
> あと基礎素養としてのCな
俺ならLispも基礎素養の方に入れるな。


554:デフォルトの名無しさん
08/05/15 22:38:28
Rails初心者です。
rubyをインストール(c:\ruby)後、gemsにてRailsをインストールしました。
そして、MYSQLをインストールしたが、apacheも必要とわかり、MYSQLをアンインストール後
XAMPPをインストール(c:\xampp)。
ウェブアプリ作成用フォルダをc:\rails\を作成し、
テストをc:\rails\testで制作したがrhtmlが上手く表示されないので、教えて下さい。
コマンドプロントで

c:\rails>rails test

でフォルダ一式を作成した。
その後、WEBrickにて[localhost:3000/]アクセスすると初期画面は表示されました。
さらに、コマンドプロントで

c:\rails\test>ruby script\generate controller main

と指示を行い、c:\rails\test\app\controllersにmain_controller.rbがきちんと出来ていました。
main_controller.rbの内容→class MainController < ApplicationController end

次ぎにmain_controller.rbをテキストエディタで「def index」でアクションを追加し、
c:\rails\test\app\views\mainのフォルダの中に「index.rhtml」を作成しました。

index.rhtmlの内容→<html><head><title>あいさつ</title></head><body><h1>こんばんは</h1></body></html>

それで、WEBrickにて[localhost:3000/main/index]にアクセスすると
MissingSourceFile in MainController#index
とエラーが出てしまいます。

どうか解決法を教えて下さい。

555:デフォルトの名無しさん
08/05/16 00:01:12
Mac で使ってます。
rubygems をインストールしました。

gem install proggresbar
を実行したのですが

Bulk updating Gem source index for: URLリンク(gems.rubyforge.org)
/usr/local/lib/ruby/site_ruby/1.8/rubygems/specification.rb:556: [BUG] Segmentation fault
ruby 1.8.6 (2007-09-24) [powerpc-darwin8.11.0]

というのがでてしまいます。
どのようにすればいいのか教えてください。



556:デフォルトの名無しさん
08/05/16 10:28:43
>>554
PATHの設定がうまくいってないんじゃないかな?
エラー文を見るとcontrollerが見つからないって言ってるわけだから
初心者ならインストールを個別にやるよりInstantRailsを使ったほうがよい

InstantRails関連
URLリンク(www.itmedia.co.jp)
URLリンク(instantrails.rubyforge.org)
URLリンク(japan.zdnet.com)

それからIDEはAptanaとかNetBeans推奨
WEBrickの起動も全部やってくれるから
URLリンク(codezine.jp)

初心者はとにかく楽な方法で最初を乗り切ってしまおう

557:デフォルトの名無しさん
08/05/16 19:05:44
RailsはRailsスレがよいかと
【Agile】Ruby on Rails Part6【DRY】
スレリンク(tech板)

558:デフォルトの名無しさん
08/05/16 21:04:29
生POSTを取得したいのですが、どうにも分かりません。
PHPなら、
$stdin = fopen("php://input", "r");
で開けて、EOFまでぐるぐる回すのでしょうが。
Rubyではどうするのでしょう??
ちなみにフォームから送られてくるのは、XML形式のデータです。
お願いします。


559:デフォルトの名無しさん
08/05/16 21:19:13
…なまぽすと?

require 'cgi'
cgi = CGI.new
params = cgi.params

という記述をした CGI に POST すると、params に適当なハッシュが登録されるから適当なキーで取り出せ
値は1個でも配列になってるから注意な

こんなんでどう?

560:デフォルトの名無しさん
08/05/16 21:35:25
CGIスクリプトで?
標準入力を読めばいいだけじゃないの?


561:デフォルトの名無しさん
08/05/16 22:26:07
>>555
rubyはどうやってインストールしたやつ?
それとOSのバージョンは?
Mac用バイナリはビルド方法が間違ってるという話だが、直ったのかな。

> /usr/local/lib/ruby/site_ruby/1.8/rubygems/specification.rb:556: [BUG] Segmentation fault
556行目は何?


562:デフォルトの名無しさん
08/05/16 23:06:22
>>559
ありがとうございます。
params=cgi.params
で、paramsにkey => "<?xml version" になって、その後の部分がvalueになりました。
とりあえず、取得はできました。
もうすこし、きれにとれないかしら?

>>560
ありがとうございます。
CGIです。
標準入力って、STDIN.getsとか?でしょうか??
やってみましたが、空っぽでした?何か大きな勘違いかもしれません。



563:デフォルトの名無しさん
08/05/16 23:09:44
つうかどういうPOSTの仕方してるんだ?

564:デフォルトの名無しさん
08/05/16 23:15:46
CGI.new した時点で標準入力はカラになってると思うよ
CGIモジュール内部でも標準入力を読み込み→パースしてるわけだから

565:デフォルトの名無しさん
08/05/17 00:14:41
CGi.newしたら内部でinitialize_queryメソッドを使ってPOSTデータは
読み込みきってフォームパラメータ(application/x-form-encoded)や
マルチパートとして解析してしまうので、そうでない形式ならCGI.new
せずに標準入力を読まなければならない。


566:デフォルトの名無しさん
08/05/17 00:14:53
>>558 >>562
もしかして、XML文書をリクエストボディに直接入れてPOSTしたいって意味か
フォームとか使わずに

そういう用途であれば、cgi.rbを使っている限り対応は不可能なので
他のライブラリに乗り換える必要がある
標準で済ませるならwebrick/cgi、外部ライブラリに頼るならRack

あと質問するときは「生POST」のように曖昧な書き方ではなく、もっと具体的に

567:デフォルトの名無しさん
08/05/17 00:20:35
CGI.newする前に標準入力読んで,
$stdinにStringIOを突っ込むとかするばできそうな気がしないでもない

568:デフォルトの名無しさん
08/05/17 00:49:21
まるごと Ruby! Vol.1
URLリンク(www.amazon.co.jp)
URLリンク(www.impressjapan.jp)

また懲りもせず最初からナンバー振っちゃって大丈夫なんかいのう
Vol.2 で書くネタのアテはあるんか?

569:デフォルトの名無しさん
08/05/17 00:58:16
舞波ってw
くまくまーの人か

570:デフォルトの名無しさん
08/05/17 03:44:46
>>563 >>564 >>565 >>566 >>567
みなさんどうもです。

URLリンク(d.hatena.ne.jp)
にあるように、Ajaxがらみです。
Railsならa=params[a][b][0]でいけるので
Rubyでもそんなに苦労しないだろうと思ったのですが、
その前の段階でつまずきました。


571:デフォルトの名無しさん
08/05/17 05:01:08
>>568
そうそうたるメンバー?じゃないか
これは買わねば

572:デフォルトの名無しさん
08/05/17 06:42:04
>>570 の続きです

var xml = "<a><b>c</b><b>d</b></a>";
new Ajax.Request(url, {method: 'post', postBody: xml, asynchronous: false, contentType: 'application/xml'});

prototype.jsをつかって上のように非同期でpostデータがきます。
それをRubyで捕まえようとしたのですがうまくいかず質問させていただきました。



573:デフォルトの名無しさん
08/05/17 07:31:01
>> 560 >>564 >>567
ありがとうございます。
結局、CGI.newが先に来ていたので取れなかっただけでした。
a=STDIN.gets
ですんなり行きました。




574:554
08/05/17 18:42:41
>>556さん
ありがとうございます。
すべて、一旦アンインストール(Ruby MYSQL Apache)をして、[Railsのアンインストール方法が分からないですが・・・]
InstantRailsをインストールしてみます。
IDEも初めて目にするのですが、いろいろ勉強してみます。
また、壁にぶつかった時は、どうかご教授下さい。

575:556
08/05/17 21:14:36
>>574
Rails関係ならこちらで
スレリンク(php板)
俺も常駐してるし他の人も答えやすいと思うよ

576:555
08/05/17 21:53:36
>>561
お返事ありがとうございます。
ruby は ./configure && make && sudo make install でインストールしまし
た。OS は 10.4.11 をつかってます。

/usr/local/lib/ruby/site_ruby/1.8/rubygems/ の556 は

@@non_nil_attributes.each do |name, default|
value = case default
when Time, Numeric, Symbol, true, false, nil then default
else default.dup
end

の when Time, Numeric, Symbol, true, false, nil then default です
よろしくお願いします。




577:デフォルトの名無しさん
08/05/18 09:39:51
クラスを作っています。
クラス変数の一度の宣言で、
Klass.new do |k|
 k.high 30
 k.width 40
end

klass = Klass.new
klass.high = 30
klass.width = 40

klass = Klass.new(:high => 30, :width => 40)

の全ての記法に対応出来る方法ってあるでしょうか?
attr_accessorは知っているのですが、真ん中の記法にしか対応できないですよね。。
どなたかご存じの方宜しくお願いいたします。

578:デフォルトの名無しさん
08/05/18 10:16:58
そういうメソッドを自分で作る(attr_accessor も実態はただのメソッド)

579:デフォルトの名無しさん
08/05/18 13:03:03
正直、普段から使うほうとしてはどれかひとつに限定して制限してもらったほうが落ち着く
インスタンスへのアクセサでもメソッドへの通常引数(順番重要)でもハッシュ引数でもOK、というのはちとしんどい

580:577
08/05/18 13:31:45
>>578-579
ありがとうございます。
それを聞きattr_accessorが用意されているのでそれで統一したいと思ったのですが、
klass.high = 30
klass.width = 40
とずらずらオブジェクト変数を書くのが面倒です。
みなさんずらずら書いていらっしゃるんでしょうか。
それとも何かいいやりかたがあるんでしょうか?

581:デフォルトの名無しさん
08/05/18 13:55:06
> とずらずらオブジェクト変数を書くのが面倒です。
>>577のは全部ずらずら書いてるように見えるが?
普通にinitializeの引数にすればいいじゃないの

他の2つのが良く見えるのなら、メソッドにブロックかハッシュを渡せるようにするだけ
全部出来るようにするメリットは無いよ

582:デフォルトの名無しさん
08/05/18 13:57:52
未初期化を許容するインスタンス変数以外はコンストラクタの中で埋めてやらないとまずいと思うな

583:デフォルトの名無しさん
08/05/18 14:01:07
ずらずらと書く程沢山フィールドが存在する時点で
何かが間違ってるような気もする。

584:577
08/05/18 14:12:05
>>581-583
ありがとうございます。コロコロ変わって申し訳ないんですが、
未初期化が不味いインスタンス変数がいくつもあるのでコンストラクタでハッシュを取ることにしました。
class BarGraph
 def initialize(x)
  @high = x[:high] or 300
  @width = x[:width] or 200
  etc..
こんなもんでいいんでしょうか。。

585:577
08/05/18 14:13:24
すいません。orは||です。

586:デフォルトの名無しさん
08/05/18 14:16:51
>>583
それの解消は単に initialize に書かなくなったってだけで、他のメソッドの引数が増えるだけだと思う
処理に必要な外部入力の量っていうのは一定だと思うぜ

587:デフォルトの名無しさん
08/05/18 14:17:08
>>585
意外と知らない人が多いけど、Rubyではorも使える

588:デフォルトの名無しさん
08/05/18 14:22:01
>>587

@foo = nil or 2

としたとき、@foo の値は?

589:デフォルトの名無しさん
08/05/18 14:24:51
本筋からは外れるが high じゃなくて height じゃないか

590:デフォルトの名無しさん
08/05/18 14:25:52
foo = (nil or 2)

puts foo
=> 2

591:587
08/05/18 14:28:50
>>588
ごめんなさい恥かきました

592:デフォルトの名無しさん
08/05/18 14:29:03
>>588が危険だから or は使われないんだよな
知らないわけじゃなくて、結合度の関係で意図的に避けられているだけだ

593:デフォルトの名無しさん
08/05/18 14:31:42
理解してれば普通に使うだけだろう

594:デフォルトの名無しさん
08/05/18 14:35:35
結合度表が頭に入ってるって人は旧い人を除いて稀だと思う
表を確認するくらいなら () で括るし、面倒になってきた人はあらかじめ || だけ使うだろう
結合度によるバグは見つけるのめんどくさいバグだから

or なら期待通りに動作するが || だと動かない、という例があった気がするがどこだったか

595:デフォルトの名無しさん
08/05/18 23:06:14
俺はテスト用のシェル紛いの簡易インターフェイス書くために
while print('>>> ')or gets
p eval($_)rescue p $!
end
なんてよく書いてしまう
いやirbでも良いとは思うんだけどねw

596:デフォルトの名無しさん
08/05/19 00:12:19
結合度の他には || が式を作るのに対して、
orは文を作るってところか?

597:デフォルトの名無しさん
08/05/19 00:44:20
Rubyに文なんてないよ。


598:デフォルトの名無しさん
08/05/19 00:47:36
いや、これのことか。

URLリンク(www.ruby-lang.org)
>また、メソッドの引数に指定できない式と指定できる式があります(このよう な式
>を「文」と呼び分ける場合があります)。

>メソッドの引数に指定できない式の例
>and, or, not
>if/unless/rescue 修飾式, ...


599:デフォルトの名無しさん
08/05/19 01:43:01
Windowsだけど、
rubyスクリプトをPowerShell上で直接動かすと、
別に、コマンドプロンプトが開いて、そこで実行しちゃうのはなんで?

./hoge.rb で実行すると、コマンドプロンプトが開いてしまう。
ruby hoge.rb だと、ちゃんとPower Shell上で動く。

pythonは
./hoge.py でもちゃんとPower Shell上で動く。

ruby 1.8.6 (2008-03-03 patchlevel 114) [i386-mswin32] と、
ActiveScriptRuby 1.8.6(p114)
で確認。

600:デフォルトの名無しさん
08/05/19 02:52:02
>>599
拡張子の関連付けの問題じゃあなかろうか?


601:デフォルトの名無しさん
08/05/19 04:25:59
>>596
できるよ。
以上。
はい次の方。

602:デフォルトの名無しさん
08/05/19 09:09:43
>>599
ASRインスコフォルダの bin に行って、ruby.batをいじってみんさい

603:デフォルトの名無しさん
08/05/19 14:18:14
文字列置換の質問です。

 puts "hoge_mage-fuoo1.2.3".sub(/^(.+)-.+$/,$1)

というのがirbだとうまくいくのですが、ファイルに書いて実行するとエラーになります。

 in `sub': can't convert nil into String (TypeError)

これを解決する代替案はどのようなものがありますでしょうか?

604:デフォルトの名無しさん
08/05/19 14:21:37
>>603
ああ、これFAQレベルの質問だ。
自己解決しました。

 puts "hoge_mage-fuoo1.2.3".sub(/^(.+)-.+$/,$1)

かブロックで、

 puts "hoge_mage-fuoo1.2.3".sub(/^(.+)-.+$/) { $1}

だ。
irbは2回やったから上手くいったんだ。

自分でメモまでしといたのに忘れるとは・・・。

605:デフォルトの名無しさん
08/05/19 14:22:06
>>604修正

>  puts "hoge_mage-fuoo1.2.3".sub(/^(.+)-.+$/,$1)

puts "hoge_mage-fuoo1.2.3".sub(/^(.+)-.+$/,'\1')

606:デフォルトの名無しさん
08/05/19 14:25:36
本当に本気でどうでもいいんだけど、
カッコとブレースの間って空白置く派が多いのかな?
){
のほうが個人的には気持ちいいんだけど

607:デフォルトの名無しさん
08/05/19 17:26:22
>>606
空白置く派だな。
標準添付のもほとんどそのはず。

608:デフォルトの名無しさん
08/05/19 17:30:26
>>576
自前なのか。

修正済のバグかもしれないので、1.8.6-p114とか1.8.7-preview3あたりで確認を。
それでも落ちるようなら、gdbでバックトレースを。
めんどくさいのでできればBTSに。

609:599
08/05/19 20:07:42
結論を言うと、Rubyのせいじゃなくて、
環境変数 PATHEXTに.rbが登録されてないせいだった。
.pyはpythonをインストールした時に登録されてたらしい。

PATHEXTに登録されてない場合に、
関連付けでコンソールアプリが実行されると、
コマンドプロンプトが開くのがデフォみたい。

でも、いまいち納得できないな。
どちらにしろ、コマンドプロンプトなんか開く必要無いのに。

610:デフォルトの名無しさん
08/05/19 20:21:55
winの設計思想のなんたるか、だねえ

じき滅ぶよ、きっと

611:デフォルトの名無しさん
08/05/19 20:32:20
人口に膾炙して10年以上も経ってるのにまだそんな口きくかね

612:デフォルトの名無しさん
08/05/19 20:52:05
んー、既に自滅した気が、なんて言ったっけ、VIS...

613:デフォルトの名無しさん
08/05/19 21:18:21
コンピュータが始まってまだ60年ぐらいしか立ってないから。
無くなるときは割とあっという間だと思うよ。多分携帯に駆逐される。

614:デフォルトの名無しさん
08/05/19 21:30:12
PC-98 って何で死んだんだろな

615:デフォルトの名無しさん
08/05/19 22:31:09
坊やだからさ…

616:デフォルトの名無しさん
08/05/19 23:56:00
漢字ROMに守られていた文化が
黒船に駆逐されたからでしょ

617:デフォルトの名無しさん
08/05/20 10:05:26
それまでは「パソコン」がプラットフォームの中心だったのが
Windowsに中心が移ったから。

618:デフォルトの名無しさん
08/05/20 19:28:28
Windowsが本当に駆逐されたら困るなー、と思う反面
代わりにLinuxが台頭するのはちょっと見てみたいとも思う

>>606
俺は空白置かない(くっつける)派
標準ライブラリでは二派に分かれているようだ
(検索したら、空白置いてるファイルが置いてないファイルの二倍ぐらいあった)

619:デフォルトの名無しさん
08/05/21 09:41:14
WindowsにRuby/GDまたはRuby/GD2を使いたいのですが、どうすればいいですか?
cygwinやcoLinuxではなくWindows上で直接動かす方法をご存知の方教えていただけるとうれしいです _ _

620:デフォルトの名無しさん
08/05/21 16:49:38
コンパイルしろ。

621:555
08/05/21 23:42:24
>>608
返事が遅くなってすみません。

1.8.6-p114とか1.8.7-preview2 とかをインストールしたのですが
基本的に同じような結果になってしまいます。

>> gdbでバックトレースを。めんどくさいのでできればBTSに。
これはどのようにすればいいのでしょうか?自分なりに調べてみたいのですが
どうすればいいのかよくわかりませんでした。


622:デフォルトの名無しさん
08/05/21 23:50:56
>619
ちなみにmingw版でコンパイルしたsoはmswin32でもそのまま使える
(libの下のso入れるとこに突っ込めばおk)


623:デフォルトの名無しさん
08/05/23 20:57:12
「みるみるRubygがわかる本」
は、初心者に勧められる入門書ですか?

購入なさった人、情報を持っている方など
感想等お願いします。

624:デフォルトの名無しさん
08/05/23 21:03:06
プログラミング自体初心者には
URLリンク(www1.tf.chiba-u.jp)

Ruby初心者には、他の言語の習熟レベルにもよるけど、
たのしいRubyかプログラミングRubyがいいんじゃないかな。



# その本の批評じゃなくてごめんね。
# 漏れは秀和ということだけで毛嫌いしちゃう


625:デフォルトの名無しさん
08/05/23 21:12:50
>>623
別に気にしなくていいんだけど、
立ち読みは表紙のイメージで記憶してるので書名で言われてもぶっちゃけ覚えてねー

URLリンク(www.amazon.co.jp)
で、これな

  「何が何でもとにかく『たのしいRuby第2版』との差額900円が惜しい人向け」


900円がないと明日家賃が払えないけど
Rubyの本を何か持ってないと明後日異界に連れ去られてしまうとかそういう人向け

626:デフォルトの名無しさん
08/05/23 21:13:42
あ、あと、ある一定以上の重量の本を手に持つと骨が折れる人とか

627:デフォルトの名無しさん
08/05/23 21:23:38
書籍にあるサンプルコード
URLリンク(ftp2.shuwasystem.co.jp)
……うーん…

628:デフォルトの名無しさん
08/05/23 21:35:17
3-*あたりを見るとJavaっぽいね。
RubyではgetEuroなんてまず書かない。
多分、to_euroとか

629:デフォルトの名無しさん
08/05/23 21:40:56
なんだ秀和か。
あそこの本は、よそで出てないネタを押さえてる本は買う価値があるが、
よそで出てるネタの本は微妙な出来のことが多いな。

630:デフォルトの名無しさん
08/05/23 21:46:28
>>627
とりあえずcaseのインデントが気持ち悪すぎる

631:デフォルトの名無しさん
08/05/23 21:48:42
>>628
> Javaっぽい
なかなか鋭い
URLリンク(www.amazon.co.jp)

632:デフォルトの名無しさん
08/05/23 21:53:50
>>627はftpだな
fURLリンク(ftp2.shuwasystem.co.jp)

ってftpかよ!
まあいいけど

633:デフォルトの名無しさん
08/05/23 21:57:31
Javaな奴にRubyの本を書かせるな
めんどくさいから

634:デフォルトの名無しさん
08/05/23 22:01:41
>>631
やはりJava・・・・・・・なのか?

入門書ばっかり
しかも売上が微妙なのかレビューがほとんどついてないのばっかりか

635:デフォルトの名無しさん
08/05/23 22:02:31
Rubyは『たのしいRuby』いっとけで済むからいいよな
サポートサイトのエラッタを見ても頭ひとつ抜けてる感じだ
無理やり難点を挙げるなら熱さやユーモアに欠けるぐらいか

636:デフォルトの名無しさん
08/05/23 22:07:59
本当は色々な入門書やら解説書やらが出ていいのも悪いのも結構ある、というのが理想

『たのしいRuby第2版』






というのが現実
スレ的には面倒がないが、言語普及的には好ましい状態ではない

637:デフォルトの名無しさん
08/05/23 22:09:58
Rubyで小金が儲かる、という状態でないとなあ
Rubyの書籍は売れないから出しません、というような状況になるのはまずい

638:623
08/05/23 22:23:55
皆さん情報提供ありがとうございました。

『たのしいRuby第2版』の情報等も参考にさせていただきます。

639:デフォルトの名無しさん
08/05/23 22:26:18
他言語を知ってるならピッケル本が良いんだが

640:デフォルトの名無しさん
08/05/23 22:37:12
Rubyの新しい本はRails含めて最近ちょくちょく出てるんだが、いまいちパッとしない
URLリンク(www.amazon.co.jp)
これは、読んだ限りではまあ、うん、まあ、同価格帯で勝負するだけはあるなって感じはするが
目次はここ
URLリンク(www.shuwasystem.co.jp)

641:デフォルトの名無しさん
08/05/24 10:10:42
Amazon/AWSのResponseオブジェクトをprintで出力すると
長々と内容まで出力してくれるのですが、ppで出力すると
#<Amazon::AWS::AWSObject:0x2f82e04 ...>としか出力されません。
ppで整形した内容まで出力してくれるようにするにはどうしたらいいのでしょうか?

642:デフォルトの名無しさん
08/05/24 10:46:40
>>641
今こそソース読んでステップアップするとき
pp.rb を読むんだ

643:デフォルトの名無しさん
08/05/24 16:31:14
Rubyからaccessのmdbファイル内のレコードを操作するにはどうしたらいい?

644:デフォルトの名無しさん
08/05/24 17:14:05
URLリンク(jp.rubyist.net)
そういう目的のためのwin32OLE。
あまり使ったこと無いので、使いやすいのか知らんけど

645:デフォルトの名無しさん
08/05/24 17:38:16
win32OLEは便利だと思うけど、詳しい解説がどこにあるのかがわからない。
るびまは読んだんだけどなー

646:デフォルトの名無しさん
08/05/24 19:10:13
WIN32OLEクラスの使い方さえ覚えれば、
あとはWSHの話じゃないか?

647:デフォルトの名無しさん
08/05/24 19:24:37
WSHというか、あとはそのライブラリ自体のお話ってことだよねぇ。

648:デフォルトの名無しさん
08/05/24 20:10:56
AccessのVBAでマクロ組んで、Rubyからそのマクロを呼ぶのが一番簡単そう。
Rubyから呼ぶ必要があるかどうかは知らんけど。

649:デフォルトの名無しさん
08/05/24 20:29:03
実のところRubyはほとんど関係ないんだよな
単純にWindowsプログラミングの話になってしまう

650:デフォルトの名無しさん
08/05/24 20:30:49
>>649
本質的には system() で外部コマンド呼んでるだけだからねえ…
どんなときにどんなコマンドを呼び出すべきかってのはRuby関係ないわな…

651:643
08/05/24 20:43:37
>>644のリンク先の一行レコードを追加するスクリプトサンプルみると
conn = WIN32OLE.new("ADODB.Connection") 以降はvbaと同じっぽいのでなんとかやれそう

652:デフォルトの名無しさん
08/05/25 01:36:18
open-uri を使って ftp にアクセスしたい。

require 'open-uri'

uri = URI.parse("fURLリンク(hogehoge.com)")

uri.user = 'foo'
uri.password = "fu/ha"

でエラー。uri/generic.rb の USERINFO(Regexp) が

/^(?:[-_.!~*'()a-zA-Z\d;:&=+$,]|%[a-fA-F\d]{2})*$/n

になっているのが原因で パスワードに '/' を含む事が出来ない。
URI.escape(password) をしても '/' はエンコードされず。

何か策はないでしょうか? (パスワードは変更できない)
open(uri) の uri にパスワードを含めれないのか?


net/ftp を使えばログイン出来るのだが、やりたいのは、
Pathname を使って ディレクトリを掘りながら put をしたい。



653:デフォルトの名無しさん
08/05/25 01:54:51
URI::USERINFO= /^(?:[-_.!~*'()a-zA-Z\d;:&=+$,\/]|%[a-fA-F\d]{2})*$/n
とか

654:デフォルトの名無しさん
08/05/25 02:11:13
まあ基本的には無理だな
自前で書き換えるしかないわ
スラッシュって含むことできたっけ?

655:652
08/05/25 02:44:45
>>653
素敵。

しかし別の新たなエラーが。もう少し調べます。(そもそも
掘って put は出来るのか?)

ありがとうございます。


656:652
08/05/25 02:57:43
わかった。open-uri は ファイルを扱うものなのか。
ディレクトリは扱えないのか。

失礼しました。



657:デフォルトの名無しさん
08/05/25 04:48:04
まつもとゆきひろがB型肝炎に感染
スレリンク(newsplus板)

658:デフォルトの名無しさん
08/05/25 15:24:45
質問です。

#!/usr/local/bin/ruby
print "Content-type: text/html\n\n"

print "<html><body>Hello World</body></html>"

この内容の.cgiファイルを

URLリンク(land.to)
このレンタルサーバーにアップしたのですが。
500内部サーバエラーになってしまいます。

なぜなのでしょうか?どうすれば動かせるのでしょうか?
回答よろしくお願いします。

659:デフォルトの名無しさん
08/05/25 15:35:52
エラーメッセージの意味がわからんです
おしえてエロイひと

c:/ruby/lib/ruby/1.8/xmlrpc/parser.rb:152:in `fault': wrong fault-structure: {"f
aultCode"=>"Client", "faultString"=>"Application failed during request deseriali
zation: \nnot well-formed (invalid token) at line 6, column 345, byte 3640 at /h
ome/seesaa/cpan/lib/i686-linux-thread-multi/XML/Parser.pm line 187\n"} (RuntimeE
rror)

660:デフォルトの名無しさん
08/05/25 15:52:12
>>659
文字コードの知識もないspamブロガーさんこんにちは

661:デフォルトの名無しさん
08/05/25 15:56:29
>>660
そう見えるよなあ
投稿スクリプトをサンプルとして提供するのは止めたほうがいいと思うぞ

で、まあ、seesaaはShift_JISだったはずなのでShift_JISで送れ

662:デフォルトの名無しさん
08/05/25 16:07:16
>>658
CGIファイルのパーミッションを実行可能に変更していないのだと予想

663:658
08/05/25 16:41:39
解決しました。
ありがとうございました。

664:デフォルトの名無しさん
08/05/25 17:38:53
【プログラム】
#! ruby -Ks
class Ice
def sizeIce(size)
print(size)
end
end
class IceName < Ice
def initialize(name="未設定")
@iceName = name
end
attr_accessor :iceName
end
class IceSize < Ice
def initialize(size="未設定")
@iceSize = size
end
def sizeIce(size)
super(size)
print("サイズです。\n")
end
attr_accessor :iceSize
end
ice = [IceName.new("メロンソーダ"),IceName.new("レモン&ライム"),IceName.new("スイカバー")]
ice2 = [IceSize.new("中"),IceSize.new("小"),IceSize.new("大")]
for k in 0..ice.size-1
print(k+1,"個目 ",ice[k].iceName,"は",ice2[k].sizeIce(ice2[k].iceSize))
end

665:664
08/05/25 17:44:59
【表示される結果】
中サイズです。
1個目 メロンソーダはnil小サイズです。
2個目 レモン&ライムはnil大サイズです。
3個目 スイカバーはnil
【表示したい結果】
1個目 メロンソーダは小サイズです。
2個目 レモン&ライムは大サイズです。
3個目 スイカバーは中サイズです。

昨日からrubyの勉強を始めました。
初めてのプログラミングなので、わからないことが多々あり苦戦しております・・・。
上記のプログラムを実行するとエラー等は出ないのですが、表示結果が思い通りになりません。
なぜ一番最初に「中サイズです。」が表示されるのかすら理解できません。
一体どの部分に問題があるのでしょうか?
わかりにくいプログラムだとは思いますが、もしよろしければ回答お願いします。

※このプログラムは、練習目的で作っているのでわざわざ面倒なことをしています。

666:664
08/05/25 17:46:44
訂正

【表示したい結果】
1個目 メロンソーダは中サイズです。
2個目 レモン&ライムは小サイズです。
3個目 スイカバーは大サイズです。

でした。すいません。



667:デフォルトの名無しさん
08/05/25 17:59:29
(半分ほど作り変えた時点で悩む)
あー、まあいいや
print は引数をその場で画面に表示し、返り値として nil を返す

表示部とデータ部を完全に分けて考えるべき
最終的なデータを最後に print で表示するだけ、という考え方な
Ice.sizeIce で print を使っているのはよくない

668:デフォルトの名無しさん
08/05/25 18:16:52
てゆーか、継承の考え方がおーざっぱに間違ってね?
「アイスの価格」が「アイス」というクラスを継承するはずがない
「アイスの名前」や「アイスの価格」は「アイス」というクラスの変数であるべき

class Ice
def initialize(name=nil, size=nil)
@name = name
@size = name
end
attr_accessor :name, :size
end

data = [
["メロンソーダ","中"],
["レモン&ライム", "小"],
["スイカバー", "大"]
]
products = Array.new
data.each do |a|
products.push(Ice.new(a[0], a[1]))
end

products.each_with_index do |ice, i|
puts "#{i+1}個目 #{ice.name}は#{ice.size}サイズです"
end

669:デフォルトの名無しさん
08/05/25 18:22:51
抽象的に「アイス」があって、
「価格のあるアイス」とか「サイズのあるアイス」とか「価格とサイズのあるアイス」と
具体化...と考えているのかもしれないが、そういう継承の使い方はあっさり破綻するので
やめたほうがよい。

まずは合言葉「継承は最後の武器だ」かと。

670:デフォルトの名無しさん
08/05/25 18:34:03
>>664
k == 0 の時の出力
中サイズです。
1個目 メロンソーダはnil

k == 1 の時の出力(最初の行は↑の行に続けて出力)
小サイズです。
2個目 レモン&ライムはnil

k == 2 の時の出力(は省略)

「?サイズです。」はice2[k].sizeIce(...)メソッド実行時の出力
「?個目 ***はnil」がループ内のprintの出力
最後のnilはice2[k].sizeIce(...)の返却値 # sizeIce(...)最後のprintの返却値
# k== 0 の時 print(1,"個目 ","メロンソーダ","は",nil) になっている

問題は「経験が足りない」事
もっとたくさんソースを書いて実行してデバッグすれ

671:デフォルトの名無しさん
08/05/25 18:42:30
マニュアルには「返り値」「戻り値」があるけど「返却値」はないな

…なんで2種類あるんだ
マニュアルくらいどっちかに統一せえ

672:664
08/05/25 18:53:18
>>667-670
レスありがとうございます。
どうやら自分の言葉足らずだったようです。
現在こちらのサイトさん(URLリンク(www.rubylife.jp))のRuby入門というところを一番上から進めています。
現在は「Rubyオブジェクト指向プログラミング」の「クラスの継承」の部分まで読み終えています。
ひとつの項目が終わるごとに、その項目で覚えたメソッド等を使ってプログラムを作る練習をしているのです。
なので今回は「クラスの継承」「オーバーライド」「super(引数)」の3つを使ったものを作ろうとしていました。
・・・と自分で考えたらあんな感じになってしまったのですが、このような使い方はそもそもおかしいようですね。
色々混ぜすぎて自分でも分けがわからなくなってましたし。
次回からはもっと処理を個別に分けてプログラミングするように心がけます。
クラスの継承は結構重要そうな感じだけど、実際はそこまで実用性があるわけじゃないのかな・・・。

一番最初に「中サイズです。」が出てきてしまう理由や、「nil」が表示される問題などは解決しました。
>>668さんのような配列の書き方は非常にわかりやすい・・・次からはこのように表記したいと思います。
大変わかりやすく解説していただきありがとうございました。

673:デフォルトの名無しさん
08/05/25 20:35:05
すみません、マニュアルみたりしてるんですが、見落としてるのか分からないので、教えてください。
クラスの定義の中にたまに、「:」がでてくるんですが、:の意味を教えてください。
たとえば、
Railsだと、「t.string :title」な表現があったり、
インスタンス変数のアクセサを作るときは、「attr_accessor :x, :y」とかしますよね。
この:の意味が掴めないですorz

class CreateArticles < ActiveRecord::Migration
def self.up
create_table :articles do |t|
t.string :title
t.text :description
t.string :image_url
t.decimal :price
t.datetime :date
t.string :vender
t.string :category

t.timestamps
end
end

def self.down
drop_table :articles
end
end

674:デフォルトの名無しさん
08/05/25 20:41:49
それはシンボルというものだ

675:デフォルトの名無しさん
08/05/25 21:18:50
というか、Symbol クラスのインスタンスだと説明したほうがいいかも

Rubyのメソッド名や変数名は内部的に数値で管理されてる
(2455番目に登録されたメソッド、とかそんな感じで、オブジェクトIDとは別物)
シンボルは、その数値に文字でアクセスすることができる機構だ
結果として、「文字」でメソッド自体を指し示すことができる

普通に foo と書いたら foo メソッドが動いてしまって「foo というメソッド」を指し示すことができない
しかし、そのとき「メソッド foo を示す登録番号」という指定の仕方ができるとしたら、「foo というメソッド」という指定の仕方ができる

腹減ってるので自分でも何書いてるかわからなくなってきた
試しに適当な変数作って、それと同じ名前のシンボルに to_i してみ
それが内部整数値だ
シンボルを id2name するとシンボルに対応する文字列が返る
時々「シンボルを文字列にする」という表現で説明されるがこれは本当は誤り

676:デフォルトの名無しさん
08/05/25 21:26:03
余計わからなくなるので>>675は読まなくてよし
もう遅いかもしれんが

677:デフォルトの名無しさん
08/05/25 21:31:28
>>674
>>675

さきほど、rubyの公式にアクセスできたので、FAQ見てたらシンボルということは分かったところで、余計に理解に苦しんでましたが、、、

>>普通に foo と書いたら foo メソッドが動いてしまって「foo というメソッド」を指し示すことができない
>>しかし、そのとき「メソッド foo を示す登録番号」という指定の仕方ができるとしたら、「foo というメソッド」という指定の仕方ができる

神レスありがとうございました!よく分かりました!!

678:デフォルトの名無しさん
08/05/26 10:28:13
URLリンク(www.ruby-lang.org) が落ちているような。

679:デフォルトの名無しさん
08/05/26 10:32:27
500とかはいつものことだろ、と思ったが router2.netlab.jp で止まっててアクセス自体ができないな

680:デフォルトの名無しさん
08/05/26 17:39:26
SymbolとStringの違いは「優しいRailsの育て方」本が一番わかりやすかったな。
あのキモいアイドルAAを我慢できればの話だけど。

681:デフォルトの名無しさん
08/05/26 20:55:34
Rubyで作成したGUI上で動くちょっとしたソフトウェアを
windowsクライアントに配布して利用してもらいたいとき、
クライアントのPCにもRubyをインストールしておかないと
実行できないでしょうか?

682:デフォルトの名無しさん
08/05/26 21:04:09
>>681
exerbでぐぐってみるとか。


683:デフォルトの名無しさん
08/05/26 21:05:54
Ruby/Tk以外で作らないと駄目だな

684:デフォルトの名無しさん
08/05/26 21:18:10
>>682、683
exerbを利用すればいいのですか。
新しいツールは、勉強もかねてRubyで作ることにします。
さっそく、本を買いに行ってきます。
レスありがとうございました。

685:デフォルトの名無しさん
08/05/26 21:20:38
rubyscript2exeもどうぞ。


686:デフォルトの名無しさん
08/05/26 21:26:22
おいおい、Rubyで自分以外のためにGUIツールを作るなんてアホのすることだぞ
渡されたほうも迷惑だからそういうことはやるな

687:デフォルトの名無しさん
08/05/26 21:37:59
じゃあ、何で書くのがいいのさ?
C#とか?


688:デフォルトの名無しさん
08/05/26 21:47:19
うん、あのね、どうやら
「もともとのGUI対応」
「付け足しのGUI対応」
の区別がつかないらしいんだ、初心者の人

689:デフォルトの名無しさん
08/05/26 21:55:42
そんなにも区別すべきなのか、というのも興味深い問題だと思うぜ

まあ、とってつけたGUIシステムで火傷したことがある人ばかりだから不評なんだけどさ

690:デフォルトの名無しさん
08/05/27 12:27:50
Winで動かす物はMSの道具立てでやった方が、楽だし誤解や面倒ごとも少ないのは確かだしな
まあ仕方ないさ

691:デフォルトの名無しさん
08/05/27 13:10:52
これはどういったプロジェクトなのでしょうか?
URLリンク(raa.ruby-lang.org)

692:デフォルトの名無しさん
08/05/27 15:14:16
一行が長くなって読みにくい場合、改行したくなるのですが、
どうしたらイイですか?

693:デフォルトの名無しさん
08/05/27 15:19:21
>>692
改行すればいいじゃん?

バックスラッシュ \ を使えば改行を隠すことができる
他にも「区切れのいいところ」で普通に改行することもできるが、
このへんは他の人のスクリプトを読んで参考にするといい

694:デフォルトの名無しさん
08/05/27 18:00:06
動的メソッドって?

695:デフォルトの名無しさん
08/05/27 18:09:56
Rubyの奥義のひとつ(いやRuby以外でもできるけど)
動的に定義されて動的に実行されるメソッドの8割は本当は静的でもなんとかなる

696:デフォルトの名無しさん
08/05/27 21:56:33
実行するまで在るか無いかわからないってこと?

697:デフォルトの名無しさん
08/05/27 22:02:04
マクロの代わりに使う例も多いと思う。

698:デフォルトの名無しさん
08/05/30 17:13:30
まるごとRuby!のVol.1を眺める
URLリンク(www.amazon.co.jp)

…endの連続はLispの閉じカッコの連続っぽくね?というのは
それはそれでヒドいと思う

現時点でのRubyの紙媒体のまとまった情報が欲しい人向け
スレ的にはちと情報が重いか

699:デフォルトの名無しさん
08/05/30 17:37:44
Railsレシピブックのほうに目が行ってしまった

700:デフォルトの名無しさん
08/05/30 18:24:17
#!/usr/bin/env ruby -Ku

とファイルの先頭に書いて実行すると、

 env: ruby -Ku: No such file or directory

と言われてしまいます。
envで-Kuをつけたいのですが、
言われないようにする方法はどのようなものがありますでしょうか?

環境は FreeBSD 6.1-RELEASE-p23 です。

701:デフォルトの名無しさん
08/05/30 18:52:34
基本的には小手先では無理
env コマンドは複数の引数をうまく受け取ることを期待できないし、環境によっても動作が違う
たとえば、その記述は同じ FreeBSD の 5.x では期待通りに動作する

702:デフォルトの名無しさん
08/05/30 18:56:33
いやenvがどうこうというよりカーネルが…

703:デフォルトの名無しさん
08/05/30 18:59:33
あ、どうするかだっけ

#!/usr/local/bin/ruby -Ku

と書くこと
ダウンロードして即実行できないことについて文句言う的外れのアホは無視
実行するスクリプト内容を確認しないような人間をユーザーに引き込むと後々癌になるぞ

で、自前で複数環境で使いたい、という場合が問題なんだが

704:デフォルトの名無しさん
08/05/30 19:20:38
>>700
shebang行(#! で始まる)に渡せる引数は1つ、という実装が多いから無難なのは、

#!/usr/bin/env ruby
$KCODE='u'


705:デフォルトの名無しさん
08/05/30 19:32:52
ruby -Ku と $KCODE='u' はカレーとウンコくらい違う

ちなみに Ruby1.9 ではカレーとウンコが同じになった

706:デフォルトの名無しさん
08/05/30 19:37:32
>>705
あれ? $KCODEは無視されるんじゃなかったか?

707:デフォルトの名無しさん
08/05/30 19:45:49
warning: variable $KCODE is no longer effective;

値を参照しても代入しても常に nil という頑なな感じの動作

708:デフォルトの名無しさん
08/05/30 19:48:01
end
end
end
end

))))


709:700
08/05/31 04:50:05
調べたらFAQ的な質問みたいですね。

解決法
・フルパスでrubyのパス記述 >>703
・$KCODEで指定 >>704

パス関係なくするためにenvにしたかったけど、意味ないなあw

ところで、$KCODEで指定する場合は、
ファイルが本当にUTF-8の文字列(例えば日本語)を含んでいても大丈夫なんでしょうか?

710:デフォルトの名無しさん
08/05/31 06:05:04
大丈夫

711:デフォルトの名無しさん
08/05/31 06:11:40
>>686
普通に喜ばれたけどw

712:700
08/05/31 06:33:23
>>710
ありがとうございます。

では、ちょっとずれてくるのですが、>>705
> ruby -Ku と $KCODE='u' はカレーとウンコくらい違う

というのはどういう違いなのでしょうか?
どこかに簡単な解説などないでしょうか?

713:700
08/05/31 06:34:05
いえ、気になったというより、変なところでハマりたくないので知っておきたい、
といった理由からです。

714:デフォルトの名無しさん
08/05/31 09:00:31
>>709
大丈夫じゃない場合がある

リファレンスマニュアルにも記述があるけど
$KCODEの指定が効いてくるのは、$KCODEへの代入が実行された後なので
最初に読むファイルに日本語が含まれていると、パースエラーになることがある

詳しくはFAQの10.2
URLリンク(www.ruby-lang.org)

715:デフォルトの名無しさん
08/05/31 13:57:32
問題になることがあるのはShift_JISの場合。
EUC-JPはUTF-8にはそういう性質はない。

-Kを指定してあれば日本語を識別子に使うこともできるが$KCODEでは無理
という違いもあるが、それは正直お薦めしない。

ちなみに-Kは1.9でもきくが、マジックコメントのほうが推奨。

#!/usr/local/bin/ruby
# -*- encoding: ut-f8 -*-


716:デフォルトの名無しさん
08/05/31 20:25:40
#!/usr/local/bin/ruby
# -*- coding: utf-8 -*-


717:デフォルトの名無しさん
08/05/31 23:56:12
HOME['ENV'] って何だよ・・・


718:デフォルトの名無しさん
08/06/01 00:12:49
>>717
誰か間違えてそうでありそうで無いな

719:デフォルトの名無しさん
08/06/01 00:17:31
図書館にこの本があったので借りてみて一通り目を通してみました
URLリンク(www.amazon.co.jp)

で、次に何かRuby買ってみようと探してみて
URLリンク(www.amazon.co.jp)
これが本屋さんあったけど・・・
上のと同じ本?



720:デフォルトの名無しさん
08/06/01 01:07:13
今なら下がお勧め

721:デフォルトの名無しさん
08/06/01 01:28:02
mod_rubyを動かしたいんですが以下のようなエラーが出て動きません。
どうすれば動くようになりますか?


apache -t

apache: Syntax error on line ??? of C:/~~/httpd.conf: Cannot load
C:/~~/modules/mod_ruby.so into server: \x8ew\x92\xe8\x82\xb3\x82\xea\
x82\xbd\x83v\x83\x8d\x83V\x81[\x83W\x83\x83\x82\xaa\x8c\xa9\x82\xc2\x82\xa9\x82\
xe8\x82\xdc\x82\xb9\x82\xf1\x81B


環境
Windows Vista
Apache2.2.8


722:デフォルトの名無しさん
08/06/01 09:52:04
>>721
あなたの頭とOSが腐ってるのが原因ですね。
頭のほうはもう手遅れなので、OSの方をdebianなどに変えてmod_rubyを
apt-get一発でインストールすればどんな馬鹿でも使えるようになります。

723:デフォルトの名無しさん
08/06/01 10:07:23
>>722

   〃∩ ∧_∧
   ⊂⌒(  ・ω・)  はいはいわろすわろす
     `ヽ_っ⌒/⌒c
        ⌒ ⌒

724:デフォルトの名無しさん
08/06/01 12:35:47
文字化けしてるが、Shift_JISで
「指定されたプロシージャが見つかりません。」
と書いてあるようだな。

mod_ruby 指定されたプロシージャが見つかりません。

でぐぐるとわかるかもよ。


725:デフォルトの名無しさん
08/06/01 14:24:14
>>724
URLリンク(www.google.com)
ググったけどわかりません


726:デフォルトの名無しさん
08/06/03 16:52:27
現在実行しているRubyファイル自身のpathを取得できる特殊変数(?)というのはありますか?
宜しくお願いします!

727:デフォルトの名無しさん
08/06/03 19:45:03
事故解決しました
__FILE__

728:デフォルトの名無しさん
08/06/06 21:02:52
Rubyを使いたいのだけれど使う機会が無い。どう転べばRubyを日常使用する変人になれるのか。最初にそれを説かなければ信者は増えないだろうと思う。

729:デフォルトの名無しさん
08/06/06 21:08:17
>>728
君には必要ないよ
必要のないものに固執する必要はない
楽になるといい

730:デフォルトの名無しさん
08/06/06 21:34:52
>>728
Project Euler とかお勧め。

731:デフォルトの名無しさん
08/06/06 22:17:55
>>730
Ruby関係ないというかRubyでやるくらいならSchemeかPythonかC++でやる。

732:デフォルトの名無しさん
08/06/06 23:30:06
目的を達成するのに一番便利な言語を選べばいいじゃん。
別にこだわりはないな。

733:デフォルトの名無しさん
08/06/07 00:15:09
rails使えば

734:デフォルトの名無しさん
08/06/07 01:05:15
まあ、みんながみんなプログラマーになる必要はないわな。

Rubyに早くなれたかったらUnixかLinux使いえばいい。シェル操作が日常に
なれば、ごちゃごちゃしたものをスクリプトで一気になにかするのが快感になるはず。


735:デフォルトの名無しさん
08/06/07 02:29:00
俺は cmd.exe を使うようになってRubyの使用頻度が格段に増えた
しょぼいコマンドプロンプトの補助としては優秀

736:デフォルトの名無しさん
08/06/07 13:07:20
俺は、バッチファイルで書くのが嫌になったころからだな。
unixではシェル書くのがいやになったころから

737:デフォルトの名無しさん
08/06/07 13:08:08
シェルじゃねえ、シェルスクリプトだ。すまそ。

738:デフォルトの名無しさん
08/06/07 13:12:37
rubyの正規表現でhtmlファイルの中から<html>の様に<>で囲まれた
文字列を取り出すにはどのようにすれば良いですか
^<.*>$まではわかったのですが
<br>のように直前に文字列が存在するタグはとりだせないのです

f = open(ARGV[0].to_s)
while line = f.gets
if /^<.*>$/ =~ line
puts line
end
end
f.close

よろしくお願いします。

739:デフォルトの名無しさん
08/06/07 13:15:03
^や$(行頭と行末の位置にマッチ)を付けない。

さらに、.*だと欲張りマッチ(可能な限り長い対象にマッチ)になるので、
<h1>....</h1>に遭遇したときに全体にマッチしてしまう。
これを避けるためには、?を後ろに付けた .*?(欲張りでないマッチ)を使う。

740:デフォルトの名無しさん
08/06/07 13:18:05
>>739
ありがとうございます。
しかもアドバイスまで
ありがとうございます

741:デフォルトの名無しさん
08/06/07 13:20:11
>>739
ああ~テストしてみた所
a<html>
とかが表示されてしまいました
こうではなくて
a<html>とかの行からも
<htm>だけきりだしたいのですが・・・・

742:デフォルトの名無しさん
08/06/07 13:28:58
正規表現の中に()を書くと、括弧の内容を後で利用できる。
/(<.*?>)/ でマッチした後、$1というグローバル変数に<html>とか入ってるはず。

743:デフォルトの名無しさん
08/06/07 13:32:35
実用の上で正しい回答は「自分でコード書かずにhtmlsplit使え」
もちろん学習用としてなら意味はあるけど

>>741
行全体(line)をそのまま表示しようとしているのが原因
マッチした部分($&)だけを表示させるようにするか
もしくは742の言うとおり、括弧と$1を使う必要がある

さらに言うと、そのスクリプトだと一行で一つのhtmlタグしか切り出せない
全てのhtmlタグを切り出すには、もう少し変更が必要

744:デフォルトの名無しさん
08/06/07 13:34:16
マッチするかどうかを試験する、ということと
マッチした部分を取り出す、ということは違う
方法はいくつかあるが、概念的にめんどくさくないのは文字列に対してscanを使うこと

"a<html>b".scan(/<.+?>/){|match|
p match
}

結果:
"<html>"

745:デフォルトの名無しさん
08/06/07 13:41:27
>>743-744
まとめるとどのようになるのでしょうか
最終的には
htmlファイルを指定すると
そのページ内に存在するファイルを
音楽、動画、画像などに仕分けして
そのURLをファイルに書き込んでくれてwgetなどで簡単にダウンロードできるようにしたいんです。

746:デフォルトの名無しさん
08/06/07 13:46:14
… rubygem の mechanize 使え
<a href> で表記されたリンクをすべて抽出してアクセスして適当に保存までしてくれる
ネット上にあるページではないローカルにあるHTMLファイルを読み込まなければならない場合若干面倒だが

747:デフォルトの名無しさん
08/06/07 13:47:58
とりあえず地道にやってみるならリンクされてるAタグでのhref="~"部分を切り出して
リンク咲の拡張子なりで分類するとか

748:デフォルトの名無しさん
08/06/07 13:52:15
だから目的のものが出るまでscan繰り返せばいいじゃんよ
scanのマニュアルとか読んでくれたか?

文字列.scan(/タグ抽出/){|タグ変数1|
タグ変数1.scan(/httpで始まる半角文字列/){|URLっぽいもの|
動画URL一覧配列.push(URLっぽいもの) if URLっぽいもの =~ /動画拡張子/
画像URL一覧配列.push(URLっぽいもの) if URLっぽいもの =~ /画像拡張子/
音楽URL一覧配列.push(URLっぽいもの) if URLっぽいもの =~ /音楽拡張子/
}
}
File.open('動画.txt','w'){|f| f.puts 動画URL一覧配列}
File.open('画像.txt','w'){|f| f.puts 画像URL一覧配列}
File.open('音楽.txt','w'){|f| f.puts 音楽URL一覧配列}



749:デフォルトの名無しさん
08/06/07 13:55:11
>>746
そういうのが有ったんですね・・・・
なんだか自分が最初のアイデアって今では出せないんじゃないかって
最近思ってるんですよね。
何かアドバイスになる言葉を教えてください。
小学生の頃からプログラミングしていた根っからのプログラミング好きに
慰めの言葉を

750:デフォルトの名無しさん
08/06/07 13:55:19
hpricotだとこうか。
require 'hpricot'
require 'open-uri'
doc = Hpricot(open(URL) {|o| o.read})
puts (doc / 'a').map {|a| a['href']}


751:デフォルトの名無しさん
08/06/07 14:01:18
とりあえずは、初心者スレなので正規表現でscanするのが妥当かねえ
なんとなくだが、外部ライブラリを利用するための基礎的知識もまだ危ういように見える
便利ライブラリはもうちょい納得してから使え

752:デフォルトの名無しさん
08/06/07 14:02:22
初心者スレであんまり「gemのlibhogeを使え」なんていわないほうが
いいんじゃにゃいかな。そりゃ業務的には正解だけど、たぶん牛刀割鶏になってるよ。

753:デフォルトの名無しさん
08/06/07 14:09:36
rubygems に代表される公開ライブラリを流用するのは何故かというと

  「自力でゼロからまたアレやるのめっちゃ面倒だ」

という認識があるからなんだよな
「面倒なアレ」という経験が無いうちから使うと後々悲惨な結果に
苦労は初心者のうちにしておくとよいと思う

754:デフォルトの名無しさん
08/06/07 14:24:14
あほらし

755:デフォルトの名無しさん
08/06/07 16:33:14
別に両方教えればいいだけじゃん
html = File.read('page.html')
html.scan(/<(.*?)>/) { p $1 }

>>750
の両方。
もちろん違う人が教えてもいい。


756:デフォルトの名無しさん
08/06/07 16:33:30
URI.extractでもつかっとけ

757:デフォルトの名無しさん
08/06/07 17:38:20
文字出力、正規表現の際に'可能'という文字を使用したいのですがうまくいきません。
試しに以下のスクリプトでテストしてみました。
ファイルをSJIS保存 puts '能' => unterminated string meets end of file
ファイルをUTF8保存 puts '能' => '閭ス'
となってしまいます。

どうすれば扱えるのでしょうか?
どなたか本気でお願いします。



758:デフォルトの名無しさん
08/06/07 17:51:51
Shift_JISの場合は ruby -Ks hoge.rb で起動
UTF-8 の場合は ruby -Ku hoge.rb で起動

759:デフォルトの名無しさん
08/06/07 20:40:06
>>757
rubyは基本的に、何も指定しないと日本語を正しく扱えない
詳しくはリファレンスマニュアル(もしくは書籍)を読め

760:757
08/06/07 21:39:01
ありがとうございます!
無事に出力&正規表現が実行できました。

ファイル毎に記述する癖をつけます!

761:デフォルトの名無しさん
08/06/07 22:46:14
String#split* という関数はどういう挙動なのでしょうか?
文字列がかえるので split().join と同じだと考えていたのですが
どうにも違うようですし調べてもでてこないし

リファレンス(コードでもいいので)ご存知のかたいたらおねがいします

762:デフォルトの名無しさん
08/06/07 22:48:02
1while などアンドキュメントな部分などの部分もご存知のかた
いたら同様に示唆していただけたらありがたいです
ruby 二日目であほなこといっていたらごめんなさい

763:デフォルトの名無しさん
08/06/07 23:06:41
String#split* なんて関数は見たことない
split().join, 1while ともども簡単なコードも付けてくれると答えやすいかも
あるいはどこに書いてあったとか

764:デフォルトの名無しさん
08/06/07 23:11:34
>>761
正直、Ruby の引数展開の * はあまり好きではない
あれは Ruby として明示的なメソッドであるべきだと思う

んで、引数の配列の直後に * をつけると展開して引数に渡される

arr = [1, 2, 3]
hoge(arr*)



hoge(1, 2, 3)

と同じ動作だ
文字列を split した結果の配列が展開されて渡されてるということだな
split は引数を省略すると空白で分割して配列を返すから

hoge('1 2 3'.split*)



hoge(1, 2, 3)

と同じ
正直、あまり明快な記述とは思えないので、自分から使うのは避けたほうがよい


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch