Ruby 初心者スレッド ..
[2ch|▼Menu]
394:デフォルトの名無しさん
09/03/18 08:46:27
BasicObject継承してなにかするのは面倒だから
気軽に使えるモノではない。

当たり前だが、インスタンス作るだけで
irb> BasicObject.new
NoMethodError: undefined method `inspect' for #<BasicObject 0x3e40cc>
なんだぜ。


395:デフォルトの名無しさん
09/03/18 08:57:41
>>394
それは irb で実行しているからだ

396:デフォルトの名無しさん
09/03/18 09:02:23
irbだと最後に評価した式をinspectするから、
irb> x = BasicObject.new; nil
=> nil
とかすればいいな。

まあ、作っただけじゃHashのキーにすら出来ないんだが。


397:デフォルトの名無しさん
09/03/18 09:04:09
というかメソッドを追加せずに BasicObject.new するというシチュエーション自体が無茶設定

398:デフォルトの名無しさん
09/03/18 09:27:56
だから簡単には使えないよ、ていう話なんでしょ?


399:デフォルトの名無しさん
09/03/18 09:41:31
メソッド定義すれば普通に使える
Railsにお墨付き与えたようでちょっとやーな感じだな

400:デフォルトの名無しさん
09/03/18 09:50:45
使わないものをなんで作っちゃったんだろう

401:デフォルトの名無しさん
09/03/18 10:24:12
delegateとかその手のやつのため

402:デフォルトの名無しさん
09/03/18 10:50:09
むしろRailsがBasicObjectを直接継承したオレクラスを使いまくってくれれば、
Objectを継承してるかどうかでRails由来かどうか判定できて嬉しいかも。

403:デフォルトの名無しさん
09/03/18 10:54:35
なんだ隔離Objectなのか

404:デフォルトの名無しさん
09/03/18 11:01:06
どうせならRailsObjectにしちゃえば良かったのにね。
他にも追従するアプリが出てくるかも。

405:デフォルトの名無しさん
09/03/18 11:11:27
Objectは結構いろんなメソッドに自分で反応しちゃうんで、
例えば、「どんなメソッドも全部リモートに投げるデレゲート」を作るとか、
そういう時に不便、とかそういう理由で作られた。

URLリンク(www.rubyist.net)
URLリンク(www.rubyist.net)
URLリンク(www.rubyist.net)

406:364
09/03/18 11:13:04
ありがとうございます。理解が深まります。

>>365-366
String#empty?ってあるんですね!
irbで試した時、ないよーって言われたからないものだと思ってた。多分スペルミスだ・・・

>>375-378
nil判定はいつも
hoge if nil_obj
と言う風にやってたよ。nil_obj.nil?使うようにするよ

407:デフォルトの名無しさん
09/03/18 11:54:24
いや、if の条件にオブジェクト1個どっかんと置くのは有効だし一般的だ
複合条件で「nil かどうか」を調べたいときには nil? を使うとわかりやすいことがあるというだけの話

408:デフォルトの名無しさん
09/03/18 11:56:56
>>374
>str.empty? が NoMethodError で例外を出して終了することを前提にしているライブラリがうまく動作しなくなるから、

こんな書き方しているライブラリのほうがまずいだろ


409:デフォルトの名無しさん
09/03/18 12:04:35
rdoc が Hash#method_missing を定義したせいで net/imap がうまく動かなくなったとか色々あるじゃん

410:デフォルトの名無しさん
09/03/18 14:06:27
rdocの分際でそんなもん定義したのかよ。
というか、なんでrdocのせいでnet/imapに影響が出るんだ?

411:デフォルトの名無しさん
09/03/18 14:36:50
>>409
method_missingのことなんか知らねーよ
empty?の例をだせよ

412:デフォルトの名無しさん
09/03/18 14:40:37
Rubyつながりじゃね?

413:デフォルトの名無しさん
09/03/18 14:41:36
method_missing を定義された場合にトラップできなくなる例外の第一番目は NoMethodError

414:デフォルトの名無しさん
09/03/18 15:08:04
ふと思ったんだが、オープンクラスを利用したクラス拡張って
厳密にはリスコフの置換原則に違反してる?
method_missingその他の振る舞いを微妙に変えちゃうので

415:デフォルトの名無しさん
09/03/18 15:18:35
>>414
オープンクラス云々ではなく、method_missingを使ったクラスの
サブクラスが(定義時点だろうと)メソッドを増やす時点で
反してるんだと思う。

なんつーかmethod_missingって奥の手の一つでしょ?

416:デフォルトの名無しさん
09/03/18 15:24:44
言語べったりの特殊機能
OOPとかそういうのとは別の次元の存在

417:デフォルトの名無しさん
09/03/18 16:01:36
理想と現実の乖離始まったか。

418:デフォルトの名無しさん
09/03/18 22:10:36
どこのObjective-C

419:デフォルトの名無しさん
09/03/19 03:14:22
rubyもメモリリーク地獄に陥るのか。

420:デフォルトの名無しさん
09/03/19 03:26:48
シンボルの存在意義がイマイチわかりません。
ハッシュのキーにシンボル使うと速度出るんですか?

421:デフォルトの名無しさん
09/03/19 03:41:17
ハッシュ値の生成式の違いから、相対的には早くなるかもしれんが、
速度目的で使うことはないと思うよ。
lispとかやってりゃシンボルのほうが自然だと思えるケースも理解できる
と思う。


422:デフォルトの名無しさん
09/03/19 04:00:55
例えば :hello というシンボルはプログラム内で唯一のインスタンスになる
同じ内容の文字列は複数生成されるけど、シンボルはされない

def put_str_id ; puts 'hello'.__id__ ; end
def put_sym_id ; puts :hello.__id__ ; end
3.times { put_str_id }
#=> バラバラの数値が出力される == 呼ばれる度にインスタンス生成
3.times { put_sym_id }
#=> 同じ値が出力される == 常に同一のインスタンス

記述される場所が違っても同一のインスタンスが使われるので
メモリ消費が少ない、インスタンス生成コストが無い、という利点はある

423:デフォルトの名無しさん
09/03/19 04:12:05
× インスタンス生成コストが無い
◯ 初回以外インスタンス生成コストが無い

424:デフォルトの名無しさん
09/03/19 04:37:35
シンボルだとエディターの色分けで、文字列と別色になって便利だから使ってる

425:デフォルトの名無しさん
09/03/19 05:54:06
Symbol って Fixnum と同じで即値じゃなかったっけ?
オブジェクトのための構造体をヒープに割り当てたりとかはしないはずなので
文字列より生成コストは低いと思うよ

評価される度に新しいインスタンスを生成する文字列リテラルより
ほんちょっと精神衛生にもよい気がする

426:デフォルトの名無しさん
09/03/19 06:01:14
シンボルとは何か
URLリンク(i.loveruby.net)

今でも通用するのか知らんけどw

427:デフォルトの名無しさん
09/03/19 09:19:51
>>420
・Fixnumと同じく即値なので、生成がきわめて軽い
・書くのが楽

ただし濫用すると「あれここStringだっけSymbolだっけ」という混乱が発生する諸刃の剣

428:デフォルトの名無しさん
09/03/19 09:23:03
で、とりあえずメソッドの頭で to_sym と

429:デフォルトの名無しさん
09/03/19 10:13:37
Symbolに数値を割り当てることは可能ですか?

430:デフォルトの名無しさん
09/03/19 10:16:23
irbでやってみれ

431:デフォルトの名無しさん
09/03/19 10:57:35
>>420
Yugui著『初めてのRuby』p.75より
「文字列同士は、内容が同じであっても一般には同一のオブジェクトとは限らない」
「シンボルは、内容が同値であれば必ず同一のオブジェクト」
「シンボル同士は文字列同士に比べて高速に同値生を判定できます」


432:431
09/03/19 10:58:12
>>431
同値生→同値性

433:デフォルトの名無しさん
09/03/19 11:01:32
勉強になった

434:デフォルトの名無しさん
09/03/19 11:07:04
ただし、シンボルの元となった文字列はずっとメモリ中に残るので、
調子に乗って長大な文字列をばんばんシンボル化すると
えらいことになる。

435:デフォルトの名無しさん
09/03/19 11:21:10
というか、文字列の代わりにシンボルを使うことはない
シンボルは、シンボルとしての用途を外れることはない
ハッシュ引数のキーとか、
{:title=>"タイトル1", :author=>"著者1", :isbn=>"ISBN1"} というデータがどっさり入ってる配列とか

to_s や to_sym を使う必要がないような場所、というのが目安なんじゃないかと思う

436:デフォルトの名無しさん
09/03/19 12:02:17
p :hoge


437:デフォルトの名無しさん
09/03/19 12:12:35
個人的にはスクリプト内部で完結して、かつStringとしての性質が
不要な時に使ってる。

Cなんかで定数を列挙しておいて、コード上では名前だけど
実装的にはその数値で処理を行うような場面がSymbolの用途まんまだと思う。

438:デフォルトの名無しさん
09/03/19 12:13:26
個人的な判断の仕方ね。
同じような使い方をしてる人は多いっていうかそれ以外はまず見ない。

439:デフォルトの名無しさん
09/03/19 12:19:47
なぜシンボルなのかを聞かれてメモリー上の効率が云々言ってたらプギャーしていい

440:420
09/03/19 14:07:41
皆様ありがとうございました。
とても勉強になりました。

441:デフォルトの名無しさん
09/03/19 15:32:04
>>429
Symbolがそもそも数値なのだが

442:デフォルトの名無しさん
09/03/19 15:53:05
ユーザーがシンボルと文字列、どちらを渡してもいいように
内部では to_sym が俺のジャスティス

443:デフォルトの名無しさん
09/03/19 16:37:24
>>441
Symbol が数値なのはわかりますが
:fuga という Symbol があったとして
それに 5 を割り当てることは出来ますか?
という意味ですよ

>>437
任意の数値を割り当てられる訳ではないから
>コード上では名前だけど実装的にはその数値で処理を行うような場面
ではあるけど列挙型やマクロと完全に同一視は出来ない
また違ったものでしょう

444:デフォルトの名無しさん
09/03/19 16:40:29
>>443
シンボルはただのオブジェクトだぞ
それは "str" が 5 になりますか、という質問と同じだ

445:デフォルトの名無しさん
09/03/19 16:47:59
10 / 3
10.div 3
の結果に絶望した

446:デフォルトの名無しさん
09/03/19 16:52:17
>>445
Integer のメソッドの返り値が Integer であることに何の不整合があろうか、いや、ない


直感的でないことには異論を待たないが

447:デフォルトの名無しさん
09/03/19 16:55:09
self と引数の両方を自動で Float にして計算するメソッドとかがあってもいいのにな〜とは思わなくもなくもない

448:デフォルトの名無しさん
09/03/19 16:56:00
>>444
10 に 5 を割り当てられますか? の方がニュアンス的には近いとオモ

>>443
> 列挙型やマクロと完全に同一視は出来ない

まあ、割り当てた値を使ってビット演算したりする場合はそうだろうけど、
単に他の値と区別できたらいいという局面ではシンボルがラクだろうな

449:デフォルトの名無しさん
09/03/19 16:56:18
>>443
だからスクリプト内部で完結する場合って言ってるじゃんw


450:デフォルトの名無しさん
09/03/19 16:59:46
>>445
その結果がIntegerじゃなかったら破綻するプログラムもいっぱいあるだろう

>>447
fdiv とか fmod とか?

451:デフォルトの名無しさん
09/03/19 17:31:42
>>443のわかってないっぷりにワロタw

452:デフォルトの名無しさん
09/03/19 17:48:17
何が割り当てられるか分からないのに
何かを割り当ててどうこうしようという発想が馬鹿ぽい

453:デフォルトの名無しさん
09/03/19 18:03:17
OOP自体、メモリの使用効率考えたら負け。

454:デフォルトの名無しさん
09/03/19 18:06:34
んなこたない

455:デフォルトの名無しさん
09/03/19 18:58:53
メモリの使用効率なんかどうでもいい
 ↓
スラッシング多発
 ↓
クソプログラム

456:デフォルトの名無しさん
09/03/19 19:33:14
×OOP自体、メモリの使用効率考えたら負け。
○Rubyでメモリ効率や実行効率を考えると空しくなる

457:デフォルトの名無しさん
09/03/19 19:33:31
正規表現を外の設定ファイルに出す、うまいソリューション(笑)はありませんか?

今はyamlで、

hage_check_pattern: /hogemage/i

と書いて、

yaml = YAML.load("my_settings.yml")
hage_check_pattern = eval(yaml["hage_check_pattern"])

としているのですが、evalるのがちょっと不安です。
外のファイルは外からいじられない前提なので問題ないっちゃーないんですが、もう少し安心な方法がないかと思いまして。

458:デフォルトの名無しさん
09/03/19 19:35:02
そうは言ってもシンボルはGCされないので,
リテラル以外でシンボル作るのは怖いなあ

459:デフォルトの名無しさん
09/03/19 19:36:44
>>457
そもそも外部入力は一律で信用できない
外部ファイルを読み込むと決めた時点で、不安とか言っちゃ駄目

460:デフォルトの名無しさん
09/03/19 19:38:13
>>457
ためしに 正規表現リテラルをto_yamlしてみるといいよ。


461:デフォルトの名無しさん
09/03/19 19:39:02
お掃除必須なほどシンボル使うってどんなプログラムだよ

462:デフォルトの名無しさん
09/03/19 19:48:05
>>457
to_yamlはやってもらうとして、別解としてはMarshal(PStore)とか

463:デフォルトの名無しさん
09/03/19 19:48:56
>>457
Regexp.new(yaml["hage_check_pattern"]) かな
正規表現に限定できるだけ、evalよりは安全

464:デフォルトの名無しさん
09/03/19 19:49:49
>>462
エディタで編集できないと駄目なんだと思う
というか、そうでなければ正規表現を書き出す理由がない

465:デフォルトの名無しさん
09/03/19 19:57:25
>>464
すまん、設定ファイルかw

>外のファイルは外からいじられない前提なので
「スクリプトの外」・・・自分もいじらないんだと解釈してた


466:デフォルトの名無しさん
09/03/19 21:29:01
Python の re.compile() に相当するメソッドはありますか?

467:466
09/03/19 21:31:26
自己解決しました。

468:デフォルトの名無しさん
09/03/21 00:15:26
Rubyでothelloをつくりたいのですが
何から始めればよいでしょう

469:デフォルトの名無しさん
09/03/21 00:18:07
>>468
まず僕とバトルしませんか?

470:デフォルトの名無しさん
09/03/21 00:24:27
>>468
コンピュータとの対戦なのか、対人戦なのか。

コンピュータ戦ならアルゴリズムの本。
対人戦ならネットワークの本。
言語は問わない。

画面をどう作るかみたいな話は後でいい。


471:デフォルトの名無しさん
09/03/21 00:57:00
人対人のネットワーク戦にしたらいい
思考する部分は作らなくて良い

472:デフォルトの名無しさん
09/03/21 00:59:03
>>468
作りたいものがオセロってはっきり決まってるんだから、画面から入るってのも一つの方法だとは思う。
例えば、
 1.盤面の状態保持
 2.出力
 3.入力と、それによる盤面操作。
の順番で、「形だけ」つくってイメージをするとか。

ここまではそれがオセロでも将棋でも対して変わらないけどな。
また、vs人間でもvsコンピュータでも変わらない。
んでゲームフローとしての入力手番のループとか、ルールに従った入力チェックや盤面操作処理、勝利条件の判定などを後付け。
最後に入力方法や出力や、やりたければコンピュータの思考ルーチンに凝りまくって完成、でいいのでは。

とりあえず、できる所からステップを踏んでやっていくのがいいかと。
各ステップごとにいろんな手法があるだろうし、それを調べ考えるのが楽しいんじゃないかと思う。
そこまで行って初めて、Rubyに関する質問も出てくるだろうしなw

473:デフォルトの名無しさん
09/03/21 01:08:40
URLリンク(www.panda21.com)
画面はここのママパンダみたいなかわいいのにしたいです

474:デフォルトの名無しさん
09/03/21 01:18:03
本人なのか本気なのかもよくわからんが、とりあえずゲーム部分は最初は文字で作れ
●と○と でなんとかなる

475:デフォルトの名無しさん
09/03/21 01:18:56
>>473
アプレットでGUIかよw どこまでがネタなのかわからんw
とりあえず、

 A B C D E F G H
1++++++++
2++++++++
3++++++++
4+++○●+++
5+++●○+++
6++++++++
7++++++++
8++++++++
→ Black ? : C4_

こんなのから始めれwww

476:デフォルトの名無しさん
09/03/21 01:21:58
+の交点に石を置くイメージはなんか違和感がありますね

477:デフォルトの名無しさん
09/03/21 01:23:02
>>476
お前プログラミング向いてない

478:デフォルトの名無しさん
09/03/21 01:23:14
喧嘩売られてるよママン;o;

479:デフォルトの名無しさん
09/03/21 01:28:11
>>476
必要は発明のマザー、という格言があってだな

480:デフォルトの名無しさん
09/03/21 01:30:16
>>477
うん、多分駄目だろうね…

481:デフォルトの名無しさん
09/03/21 01:37:47
おまえらかかってこいや〜!

 A B C D E F G H
1++++++++
2++++++++
3++++++++
4+++○●+++
5+++●●+++
6++++●+++
7++++++++
8++++++++

482:デフォルトの名無しさん
09/03/21 01:37:56
RubyはGUIと処理速度がネックだからオセロは向かないな。
というのはさておき、あっちのスレでも言われてるように475的にまずはテキスト使った簡単な表示で
オセロを作ってからグラフィック使ったものに作りかえるという手順でやればいい。
具体的なサンプルコードを含めて手取り足取りというのを期待しているなら参考文献はないに等しい。


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5390日前に更新/120 KB
担当:undef