トップページ⇒tech
1001コメント341KB

Ruby初心者スレッドPart5

■ このスレッドは過去ログ倉庫に格納されています
000112006/03/27(月) 04:59:25
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは2以降。Ruby on Railsの質問はWebProg板のRailsスレで。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・ぐぐる
 ・マニュアルで探す http://www.ruby-lang.org/ja/man/
 ・FAQを読む http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(なるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
000212006/03/27(月) 05:00:24
#本スレ
Rubyについて Part 19
http://pc8.2ch.net/test/read.cgi/tech/1140762419/

#関連スレ
【Agile】Ruby on rails相談所【DRY】
http://pc8.2ch.net/test/read.cgi/php/1118663500/

RUBYの宿題教えてください。
http://pc8.2ch.net/test/read.cgi/tech/1106572657/

【最高言語】 Rubyist Magazine創刊 【ルビま!】
http://pc8.2ch.net/test/read.cgi/tech/1094825807/


#過去スレ
Ruby初心者質問スレPart1
http://pc5.2ch.net/test/read.cgi/tech/1100534824/

Ruby初心者質問スレPart2
http://pc8.2ch.net/test/read.cgi/tech/1107799347/

Ruby初心者質問スレPart3
http://pc8.2ch.net/test/read.cgi/tech/1125587131/

Ruby初心者スレッドPart4
http://pc8.2ch.net/test/read.cgi/tech/1137927749/
000312006/03/27(月) 05:13:31
#関連リンク

Ruby Home Page
http://www.ruby-lang.org/ja/

リファレンス
http://www.ruby-lang.org/ja/man/
http://www.ruby-doc.org/ (英語)

FAQ
http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ

Programming Ruby - The Pragmatic Programmer's Guide … 書籍をまるごと公開
http://www.ruby-doc.org/docs/ProgrammingRuby/

RAA - Ruby Application Archive … Rubyのアプリやライブラリが検索できる
http://raa.ruby-lang.org/

RubyForge … sourceforge.netのRuby特化版
http://www.rubyforge.org

日本Rubyの会 公式Wiki - 日本Rubyの会Wiki … Ruby関連のニュースとか
http://jp.rubyist.net/

Rubyist Magazine - るびま … RubyのWebマガジン
http://jp.rubyist.net/magazine/
000412006/03/27(月) 05:14:59
#関連リンク

Matzにっき … Ruby作者の日記
http://www.rubyist.net/~matz/

Ruby hotlinks 五月雨版 … Ruby関連の日記やblog
http://www.rubyist.net/~kazu/samidare/

Rubyの本一覧
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=Ruby%A4%CB%B4%D8%A4%B9%A4%EB%BD%F1%C0%D2

<rubyXML/>
http://www.rubyxml.com/

Ruby Weekly News @ Ruby Garden
http://www.rubygarden.org/rurl/html/
0005デフォルトの名無しさん2006/03/27(月) 06:39:24
乙
0006デフォルトの名無しさん2006/03/27(月) 09:38:08
真の本スレ立て乙。>>1
0007デフォルトの名無しさん2006/03/27(月) 20:38:59
scheme の apply を使った関数呼出しと同様のメソッド呼出しはどのように書けばよいのでしょうか?

(define (f x y z) (+ x y z))
(define (g) (list 1 2 3))
(apply f g) -> 6

と同じことを ruby で書きたいということです。マニュアル
http://www.ruby-lang.org/ja/man/?cmd=view;name=%A5%E1%A5%BD%A5%C3%A5%C9%B8%C6%A4%D3%BD%D0%A4%B7
眺めて手元の ruby 1.8.2 on Debian GNU/Linux sarge で試してみたところでは

def f (x,y,z) x+y+z end
def g () [1,2,3] end
f(*g) -> 6

でよさそうなのですが、これで「正しい」のかちょっと確信がもてないものでして…。


0008デフォルトの名無しさん2006/03/27(月) 20:48:00
>>7
あってる。
メソッド名も動的に変わる場合は
name = 'f'
args = [1, 2, 3]
__send__ name, *args
かな。

SchemeユーザのためのRuby入門・・・需要なさそう
0009デフォルトの名無しさん2006/03/27(月) 21:27:59
素早いお返事いただきありがとうございました >>8
ちょうど ruby-lang.org が重いのかなにかでマニュアルにアクセスできないのですが
__send__ というのは Object のメソッドでしたっけ、うーむ難しい。

> SchemeユーザのためのRuby入門・・・需要なさそう

私は perl5 を覚えたときにけっこう LISP/Scheme の初歩的な知識から対応付けしていって理解できた(つもり)ところがあるので、Ruby でもそういうのあると嬉しいように思います(他力本願過ぎ?)
0010デフォルトの名無しさん2006/03/28(火) 03:02:36
net/httpで取得して、p hoge.headerとかできないけど、どうすれば表示出来る?
p hoge.bodyは問題ないのに。orz
0011デフォルトの名無しさん2006/03/28(火) 06:11:51
>>10
実際に試してみたコードをさらしてみて。
0012デフォルトの名無しさん2006/03/28(火) 09:03:31
>>8
> SchemeユーザのためのRuby入門・・・需要なさそう

むしろ逆のほうが需要あると思う。
0013デフォルトの名無しさん2006/03/28(火) 10:37:33
>>12
>むしろ逆のほうが需要あると思う。

RubyユーザのためのSchemeつーかLisp入門、かなりあったらいいかも。

コンスセルとか結構最初わけわかなくなったしww LispをLL系言語のラテン語?と思い(こんで)勉強中っす。

0014デフォルトの名無しさん2006/03/28(火) 11:55:45
今はSchemeがプチブームなのか?オレンジニュースでも取り上げられていたし。

>>13
RubyわかるならSchemeもわかるんじゃないか。
オブジェクト指向と関数型、どっちが難しいかといえば、オブジェクト指向に一票。

Schemeは
・変数に関数を代入する
・whileのかわりの末尾再帰呼び出し
・継続
がわかれば、そんなに難しくないような気が。
SICPは難しいけどね。
0015デフォルトの名無しさん2006/03/28(火) 11:59:02
最近はむしろ Ruby ユーザのための Haskell 入門の方が需要があると思う。

ウソ。
0016デフォルトの名無しさん2006/03/28(火) 12:29:28
>>14
個人的にはLisp系の括弧だらけのスクリプトは初心者には読みにくいので
可読性の面でRubyの方がまだ簡単そうな気がする

一般に、オブジェクト指向と関数型のどっちが難しいかは知らん
0017デフォルトの名無しさん2006/03/28(火) 12:46:43
オブジェクト指向と関数型を比較するのは変な希ガス
0018デフォルトの名無しさん2006/03/28(火) 13:00:53
「Lispは早々に挫折したがRubyはなんとかなったという人に贈るLisp再入門」
とかいうのだったらきっとお金出して買う

っていうかRubyをなんとか使えてるならLisp処理系を学ぶメリット別にないじゃんと思ってみる
0019デフォルトの名無しさん2006/03/28(火) 13:10:30
ねえねえ
Scheme ユーザのための Haskell 入門まだー?
0020デフォルトの名無しさん2006/03/28(火) 13:13:42
>>2

#過去ログ
Ruby初心者質問スレPart1
http://pc5.2ch.net/test/read.cgi/tech/1100534824/
Ruby初心者質問スレPart2
http://pc8.2ch.net/test/read.cgi/tech/1107799347/
http://makimo.to/2ch/pc8_tech/1107/1107799347.html
Ruby初心者質問スレPart3
http://pc8.2ch.net/test/read.cgi/tech/1125587131/
http://makimo.to/2ch/pc8_tech/1125/1125587131.html
Ruby初心者スレッドPart4
http://pc8.2ch.net/test/read.cgi/tech/1137927749/
http://makimo.to/2ch/pc8_tech/1137/1137927749.html


#本スレ
Rubyについて Part 19
http://pc8.2ch.net/test/read.cgi/tech/1140762419/

#関連スレ
【Agile】Ruby on rails相談所【DRY】
http://pc8.2ch.net/test/read.cgi/php/1118663500/

RUBYの宿題教えてください。
http://pc8.2ch.net/test/read.cgi/tech/1106572657/

【最高言語】 Rubyist Magazine創刊 【ルビま!】
http://pc8.2ch.net/test/read.cgi/tech/1094825807/
0021デフォルトの名無しさん2006/03/28(火) 15:31:15
宿題スレもルビまスレも無いよ。

ところで自スクリプトのファイル名とパスってどうやって得る?
find /でゴロゴリ全検索?
0022デフォルトの名無しさん2006/03/28(火) 15:53:42
>>21
るびまスレはあるような。

自スクリプトのファイル名とパスは __FILE__ で得られる。
用途によっては $0 の方がいいかもしれない。
0023デフォルトの名無しさん2006/03/28(火) 15:59:55
宿題スレもあるよ
0024デフォルトの名無しさん2006/03/28(火) 16:11:08
findbin.rb (Perl の FindBin.pm) があればなあと思うことがよくある。
0025デフォルトの名無しさん2006/03/28(火) 18:04:41
こんな感じか。ありがとう。

% cat ../path_test1.rb
#!/usr/bin/ruby
p __FILE__
p $0
printf("This ruby script filename: %s\n", File.basename(__FILE__))
a = File.dirname(__FILE__)
printf("This ruby script relative pathname: %s\n", a)
printf("This ruby script full pathname: %s\n", File.expand_path(a))
% ../path_test1.rb
"../path_test1.rb"
"../path_test1.rb"
This ruby script filename: path_test1.rb
This ruby script relative pathname: ..
This ruby script full pathname: /local/ruby
0026デフォルトの名無しさん2006/03/28(火) 18:42:05
__FILE__ はデバッグ、エラー表示用というイメージが抜けないなあ
0027デフォルトの名無しさん2006/03/28(火) 21:30:56
$0のほうがいいのかな?
0028デフォルトの名無しさん2006/03/28(火) 22:21:07
__FILE__ と $0 は違うものだから、どちらが良いとか悪いとかではなく、必
要に応じて使い分ける。代表的な差としては、 __FILE__ はそのファイルの名
前だが $0 は実行プログラム名。

たとえば require された中のファイルの中では、 __FILE__ は require され
たファイルの名前だが、 $0 は大元のスクリプトのファイル名。 Ruby のライ
ブラリで「require されたときには実行されないもの」を指定するときに
if __FILE__ == $0
...
end
とか書くのは ruby のイディオムのひとつ。
0029デフォルトの名無しさん2006/03/28(火) 23:07:23
> とか書くのは ruby のイディオムのひとつ。

典型的なバッドノウハウだなw

とか言ったら釣れますか?
0030デフォルトの名無しさん2006/03/28(火) 23:24:51
#! /usr/local/bin/ruby
# This line makes the next one a comment in Ruby \
  exec /usr/local/bin/ruby -S $0 $*

%w(config lib plugin).each{|d| $:.unshift(File.join(File.dirname(__FILE__),d))}
0031デフォルトの名無しさん2006/03/28(火) 23:45:52
バッドノウハウだとは思う
ifで全体を囲まなければならないあたり特に
0032デフォルトの名無しさん2006/03/29(水) 00:29:45
ていうかこういう判別機能($0 == __FILE__)は
ruby本体に組み込むべきだと思った
0033デフォルトの名無しさん2006/03/29(水) 01:10:36
if __RUN__
0034デフォルトの名無しさん2006/03/29(水) 01:33:40
過去に何度か提案が出てるけど却下されてたはず。理由は忘れた。
0035デフォルトの名無しさん2006/03/29(水) 01:46:30
つーかライブラリにサンプルコードやテストコードを埋め込むのはどうなんだ。
時間とメモリを無駄に消費しているようで嫌なんだが。

つかテストくらい普通に書けと。
0036デフォルトの名無しさん2006/03/29(水) 03:31:18
そういや、プリコンパイルみたいなのは採用しないの?
採用すればサンプルやテストの無駄は無くなると思うけど。
0037デフォルトの名無しさん2006/03/29(水) 04:13:34
ASRでどのオブジェクトにもぶら下がってない関数
InputBox, MsgBoxはどう呼べばいいんですか?
0038デフォルトの名無しさん2006/03/29(水) 06:13:09
普通って何?
0039デフォルトの名無しさん2006/03/29(水) 06:41:36
>>35
埋め込みコードで消費する時間もメモリもたかが知れてるから
実用上の問題はほとんどないんだが……

でもまぁ、確かになんとなく嫌な感じはする
0040デフォルトの名無しさん2006/03/29(水) 08:05:11
>>35
どんな仕様がいいと思う?
おれは、標準ライブラリの使い方を調べたいとき、ライブラリにサンプルコードが載っているとわかりやすいと思っているから、
別にするのはあんまり好きじゃない。
でも if $0 == __FILE__ じゃない方法でもいいとは思う。RDocのコメントかなあ。
0041デフォルトの名無しさん2006/03/29(水) 08:58:34
スレ違い
0042352006/03/29(水) 09:41:22
>>40
RDocでいいじゃん。

例えばPerlだとPOD(埋め込みドキュメント)を拡張したTest::Inlineというモジュールがある。
こんな感じ:

=begin testing

# テストコード

=end

で、これを付属のユーティリティでプリプロセスすると実行できるというわけ。
ちなみにbegin/endはPODの開始/終了ではなく、PODを拡張するための(PerlではなくPod Parserレベルでの)予約語。
0043デフォルトの名無しさん2006/03/29(水) 09:57:56
#if 0
#endif
0044デフォルトの名無しさん2006/03/29(水) 10:53:17
>>36
プリコンパイルにしても、if $0 == __FILE__ というのは実行時に判定されるわけだから、「サンプルやテストの無駄がなくなる」わけではない。
Cのプリプロセッサとは違う。

>>39
はげどう。パースにかかる時間よりコードを実行する時間のほうがずっと大きいし、
パースしてできるツリーよりコード中で生成されるオブジェクトのほうがメモリを食っているんだから、
Rubyを使う以上そんなところを気にしても仕方ない。
気持ち悪いと感じるのはわからんでもないが。

>>42
よくわかってないけど、それってPerlを実行するときに必ず実行されるプリプロセッサ?
それとも、あらかじめプリプロセッサで処理していないと実行できないもの?
後者ならいやだなあ。せっかくコンパイルしなくていい言語なのに、プリプロセッサが必要となるならコンパイルする手間がかかるのと変わらないよな。

サンプルプログラムはRDocで書いて、テストスクリプトは別ファイルでいいような。大量のテストスクリプトがライブラリに埋め込まれるのは避けたい。

あそうか、サンプルプログラムをRDocで書くと直接実行して確かめることができないのか。
RDocに書いたサンプルを実行できるようなツールを作るか、RDocを拡張するか。
0045デフォルトの名無しさん2006/03/29(水) 10:59:59
attr_accessor でsetterとgetterが簡単に定義できますが、うしろに「?」がつくメソッドを簡単に定義する方法はありますか。
今は
def available?
@available
end
といちいち定義しているんですが、attr_accessor :'available?' とかできないんでしょうか。
0046デフォルトの名無しさん2006/03/29(水) 11:26:48
>>45
これねえ、昔は出来たんだけど、「そんなことできるのはバグ」で片付けられて
できなくなってしまった。要望出せば出来るようになるかもよ。
0047デフォルトの名無しさん2006/03/29(水) 11:27:36
Object#nil? は、なぜ定義されているのでしょうか。
ふうつに obj == nil とすればいいだけだと思うのですが、わざわざ Object#nil? というメソッドを用意している理由が知りたいです。

あと、Array#firstも謎です。arr[0]でいいと思うんですが、これも存在理由が知りたいです。
0048デフォルトの名無しさん2006/03/29(水) 11:34:30
>>30
> # This line makes the next one a comment in Ruby \
> exec /usr/local/bin/ruby -S $0 $*
相当古いバージョン使ってるな。
だいぶ前からコメントは継続できなくなってる。
-xと#!rubyを使うこと。
0049デフォルトの名無しさん2006/03/29(水) 12:17:00
どっちかっていうとArray#shuffleがないのが気に食わない
0050デフォルトの名無しさん2006/03/29(水) 12:23:23
Enumerable#inject はメソッド名が悪過ぎで、ものすごくわかりにくいと思う。
Smalltalk みたいに Enumerable#inject_into にすべきだと思う。
0051デフォルトの名無しさん2006/03/29(水) 12:30:37
>>47
TMTOWTDI
0052デフォルトの名無しさん2006/03/29(水) 12:31:53
>>50
injectくらい強烈なメソッドになると、名前と関係なく使い方を覚えるから問題ない。
0053デフォルトの名無しさん2006/03/29(水) 12:37:08
まあそりゃそうなんだけど、
「なんで "inject" って名前でこんな動作仕様なんだ?」という長年の悩みが、
Smalltalk には into: があるのを知ったらもうすごい勢いでスッキリしたので。
0054デフォルトの名無しさん2006/03/29(水) 14:05:25
とりあえず、Rubyに慣れたら LIPSとSmalltalkはざっとでいいから
さらっておくの吉。 こまごまとしたモヤっとがスッキリするぞ。
0055デフォルトの名無しさん2006/03/29(水) 14:10:54
>>47
物議をかもした、ファウラーのヒューメインインターフェイスでも読んでみそ。
そうあるべきと考える人がいる…くらいはなんとなくでも分かるだろ。
賛同できるかは別にして。

ttp://capsctrl.que.jp/kdmsnr/wiki/bliki/?HumaneInterface
0056472006/03/29(水) 14:37:35
>>51
>TMTOWTDI
それはperlのスローガンであって、Rubyはあまり関係ないのでは?
またもしそうなら、Object#true?やObject#false?もあるべきだし、
Integer#even? や Integer#odd? があってもおかしくないはずです。
でも現実にはそうではないので、TMTOWTDIが理由とは思えません。

>>55
ありがとうございます。読んでみました。
主張はわからなくもないですが、ならObject#true?とかInteger#even?も用意してほしいです。
arr[0] よりタイプ量が増える arr.first があるのに、i % 2 != 0 より短く書ける i.odd? がないのはなんか納得できない。
Railsのようにhelper classをたくさん作って組み込みクラスを拡張してもいいんですけど、そうすると他の人がコードを読むときに混乱するんですよね。
読み手のことを考えると、組み込みクラスをむやみに拡張するのは避けたいです。

なんか話がそれましたけど、ありがとうございました。
0057デフォルトの名無しさん2006/03/29(水) 14:49:41
==はクラス毎に役割が違う。
でもObject#nil?はどのクラスでもnilかどうかを返すのが役割。
[0]とfirstは知らん。
0058デフォルトの名無しさん2006/03/29(水) 14:50:50
Object#true? や Object#false? って何に使うの?
0059デフォルトの名無しさん2006/03/29(水) 14:55:31
>>56
odd?、even?がないのは、単にパクり損ねです。それがRubyクオリティ…。
とにかくパクるにしても徹底せず、分裂症気味なんです。
勘弁してやってください。
0060デフォルトの名無しさん2006/03/29(水) 14:58:41
>>56
firstはポリモルフィズムのためなんじゃねえの?

例えば、hoge.first は、hoge が Array でも Range でもうごく。
0061472006/03/29(水) 15:04:44
>>57
なるほど。オーバーライドのことがありましたか。
[]もオーバーライドされる可能性があるからですかね。

>>58
単に真偽値を返すだけですけど。
var = obj ? true : false
var = obj ? false : true
を
var = obj.true?
var = obj.false?
とするだけです。
var = obj
とすると、objそのものが代入されてしまいますが、そうじゃなくてboolean値が欲しい場合、あるいはobjを参照させるとまずい場合に使います。自分はよく使うんですけど。

それはそうと、RailsのObject#blank?は便利ですねー。これはぜひ標準でほしいところです。
0062デフォルトの名無しさん2006/03/29(水) 15:06:32
>>56
あるメソッドが存在するのには大抵理由があるだろうが、
あるメソッドが存在しないのには理由がないこともある。
世の中そんなもの。

Object#true? や Object#false? があるべきだと考えるのは、
Cで if (cond == TRUE) と書かないといけないと考えるのと
同じようなもんで、ありえない。
0063472006/03/29(水) 15:08:40
>>60
それならRange#[]をサポートするべきでは?そのほうがより汎用的です。
でもそうじゃないから、多態が理由じゃないと思います。


ふと思ったけど、速度が理由とか。
0064472006/03/29(水) 15:09:56
>>62
>あるメソッドが存在するのには大抵理由があるだろうが
その理由を問うているんですけど。
0065デフォルトの名無しさん2006/03/29(水) 15:10:13
>>56
>>TMTOWTDI
>それはperlのスローガンであって、Rubyはあまり関係ないのでは?

一つ目の質問とその答えを参照せよ。
http://slashdot.jp/developers/03/03/14/0258247.shtml?topic=86
0066デフォルトの名無しさん2006/03/29(水) 15:13:57
>>64
Object#nil? の存在意義は>>57がもう答えているが。
0067472006/03/29(水) 15:16:59
試してみたらarray[0]よりarray.firstのほうが高速でした。15%くらい。
これだけでArray.firstの存在に納得しました。

コード:
a = [1]
1000000.times do
a[0] ; a[0] ; a[0] ; a[0] ; a[0]
a[0] ; a[0] ; a[0] ; a[0] ; a[0]
end

実行結果:
$ time ruby hoge.rb
real 0m6.339s
user 0m4.931s
sys 0m0.040s

コード:
a = [1]
1000000.times do
a.first ; a.first ; a.first ; a.first ; a.first
a.first ; a.first ; a.first ; a.first ; a.first
end

実行結果:
$ time ruby hoge.rb
real 0m5.161s
user 0m4.134s
sys 0m0.037s

0068デフォルトの名無しさん2006/03/29(水) 15:18:05
>>63
>それならRange#[]をサポートするべきでは?そのほうがより汎用的です。

もしRange#[]をサポートしたなら、(1.0..2.0)[1] は何を返すんだね?
0069デフォルトの名無しさん2006/03/29(水) 15:19:16
>>63
0.1..0.9 があるからダメでしょ。多態がまるでわかってないんじゃない?
0070デフォルトの名無しさん2006/03/29(水) 15:26:12
15% に存在意義を見出せてしまう >>67 はさすがだと思う
0071デフォルトの名無しさん2006/03/29(水) 15:26:42
>>68
>もしRange#[]をサポートしたなら、(1.0..2.0)[1] は何を返すんだね?
例外
Range#eachもそうだし

つうかこの手の〜もサポートしてるんだから…もしろ的議論は際限がないし
仮に全部採用したら大変なことになるしかといって
その反動で拒否しまくられても進歩がない。

要望全部まとめてMatz氏につまみ食いしてもらうのが一番だな。
というわけで指が折れ眼が潰れるまでやれw
0072472006/03/29(水) 15:28:09
obj.nil? は obj == nil の半分くらいの実行時間です。
いろいろ理由をつけてもらいましたが、これがいちばんの理由ではないでしょうか。

コード:
a = 1
1000000.times do
a == nil; a == nil; a == nil; a == nil; a == nil
a == nil; a == nil; a == nil; a == nil; a == nil
end

結果:
$ time ruby hoge.rb
real 0m8.702s
user 0m6.821s
sys 0m0.053s

コード:
a = 1
1000000.times do
a.nil?; a.nil?; a.nil?; a.nil?; a.nil?
a.nil?; a.nil?; a.nil?; a.nil?; a.nil?
end

結果:
$ time ruby hoge.rb
real 0m4.956s
user 0m3.852s
sys 0m0.035s

どうみても高速です。本当にありがとうございました。
0073デフォルトの名無しさん2006/03/29(水) 15:35:56
>>72
違うだろ?上のレスをよく読め。
0074デフォルトの名無しさん2006/03/29(水) 15:39:29
字面が良いとか高速とか柔軟性が増すとか意見がまとまらなかったとか
まあいろいろ理由はある罠
0075デフォルトの名無しさん2006/03/29(水) 15:41:25
>>73
速度に目が眩んで他人の話も聞かなくなった香具師に何を言っても無駄。
0076デフォルトの名無しさん2006/03/29(水) 15:41:52
そのうち、「obj == 1 より高速にするために Fixnum#one? を
実装しろ」とか言い出しそうだな。
0077デフォルトの名無しさん2006/03/29(水) 15:47:37
とりあえず
"hogehoge".true? => false
"hogehoge".false? => false
と、ぱっと見では思ってしまうのだが俺の思慮が浅いのか。
Object.true? とはつまり、self  == trueじゃないのかと。
self === trueでもいいけど。
そもそもfalse?でtrueが返ってくる時点で何か気持ち悪い、と思う俺はunless,untilを使いこなせない派ですが。

def Object.to_b
 return self ? true : false
end
ならふーんってかんじだがまあ人それぞれだしな。
0078デフォルトの名無しさん2006/03/29(水) 15:55:07
>>77
>Object.true? とはつまり、self  == trueじゃないのかと。
それはObject.nil?でも同じだろ

==はクラス毎に役割が違う。
でもObject#true?はどのクラスでもtrueかどうかを返すのが役割。

>そもそもfalse?でtrueが返ってくる時点で何か気持ち悪い
意味がワカラン。 Object.true? が self == true だと思うんなら
Object.false? は self == falseだろ。

お前はself == falseでtrueが返ってくるのも気持ち悪いと?
0079デフォルトの名無しさん2006/03/29(水) 16:05:07
puts "boo!" unless obj.false?
0080デフォルトの名無しさん2006/03/29(水) 16:06:07
Object?
でいいのに、なんでわざわざ Object.true なんて使いたいの?
だったら、Object.true.true.true.true って気が済むまでつなげりゃいいじゃん
0081デフォルトの名無しさん2006/03/29(水) 16:08:00
↑アホ?

だったら、アホ?.アホ?.アホ?.アホ? って気が済むまでつなげりゃいいじゃん。
0082472006/03/29(水) 16:08:30
>>73
じゃあどれが本当の理由だったんでしょうか。
いろいろ理由をあげてもらって、それはそれで参考になったのですが、結局どれも決め手にかけています。
というか、どれもみなさんの*推測*でしかないんですよね?作者がそう明言したなら別ですけど。
例えば>>65のおかげでRubyでもTMTOWTDIが(メインではないけど)スローガンになっていることはわかりましたが、それはRuby全体のありかたであって、
Object#nil?やArray#firstはあるけどInteger#even?がない理由として作者がTMTOWTDIをあげたわけではないですよね。

勘違いしないでほしいんですけど、別にInteger#even?がないことを非難しているわけじゃないです。
obj==nilやarray[0]ですむのになんでわざわざObject#nil?やArray[0]を用意したのかが知りたかっただけです。
「Integer#even?もあるべき」と書いたのは、>>55で紹介されたようなことが理由だと仮定した場合の話であって、別のことが理由ならそんなことは書きません。

>>57
> ==はクラス毎に役割が違う。でもObject#nil?はどのクラスでもnilかどうかを返すのが役割。
これよく考えたら、「==はクラス毎に役割が違う」のは確かなんですけど、nilとの比較までクラスごとに違うことはないでしょうから、やっぱりObject#nil?が存在する理由としては弱いんじゃないでしょうか。
つまり、obj==otherはクラスごとに挙動が違うでしょうけど、obj==nilはどのクラスでも同じ挙動を期待していいんじゃないかということです。だからObject#nil?をわざわざ用意する理由としては弱い。
0083デフォルトの名無しさん2006/03/29(水) 16:08:35
unless にイマイチ馴染めないのには同意だが
false? で true かどうか考えるのは気持ち悪くない。
0084デフォルトの名無しさん2006/03/29(水) 16:12:51
unless obj
if obj.false?
if obj == false
if !obj

以上個人的に書きたいランキングですた
0085デフォルトの名無しさん2006/03/29(水) 16:13:54
>>82
> どれもみなさんの*推測*でしかないんですよね?
> 作者がそう明言したなら別ですけど。

だったら作者に直接聞けよ。

> nilとの比較までクラスごとに違うことはないでしょうから

勝手に決め付けるな。自分勝手な奴だな。
0086デフォルトの名無しさん2006/03/29(水) 16:14:31
大前提として、
if obj == true
とか書く奴はアホ。これはいいか?
よって、仮に Object#true? があったとして、
if obj.true?
とか書く奴もアホ。
故に、Object#true? は不要。Object#false? も同様。

ってことをみんな言ってるんじゃないかね。
0087デフォルトの名無しさん2006/03/29(水) 16:17:40
>故に、Object#true? は不要。
から
>Object#false? も同様。
に繋げるのは少し無理があるな。

なるべくカーソルを動かさずに即興的に書いていくなら使うこともあるだろう。
その意味で
"foo".puts($stderr)
となんて嬉しいかもしれないなw
0088デフォルトの名無しさん2006/03/29(水) 16:18:27
>>86
>if obj == true
>とか書く奴はアホ。これはいいか?

は?状況によっては、本当にtrueか比較したいときはあるだろ。アホか
0089デフォルトの名無しさん2006/03/29(水) 16:20:00
>>88
そういう状況の話をしているのでは無いことぐらい文脈からわかるだろ。アホか
0090472006/03/29(水) 16:20:54
>>62
>Object#true? や Object#false? があるべきだと考えるのは、
>Cで if (cond == TRUE) と書かないといけないと考えるのと
>同じようなもんで、ありえない。

Object#true? や Object#false? があるべきだと考えたのは、あくまで >>55 で紹介された主張が理由だとした場合の話です。
これ(ヒューメインインターフェース)が理由なら、もっといろんなメソッドがあるべきで、その例としてObject#true?とかInteger#odd?とかを挙げたまでです。
前提なしでいきなり「Object#true? や Object#false? があるべき」といったんじゃないです。

>>69
>0.1..0.9 があるからダメでしょ。多態がまるでわかってないんじゃない?
「0.1..0.9 があるからダメ」だとしても、それがどう多態と関係あるんでしょうか。
「0.1..0.9 があるからダメ」と関係あるのはRange#[]をサポートするかどうかの話であって、多態とは関係ないように思うんですが。
0091デフォルトの名無しさん2006/03/29(水) 16:21:49
if 文の式は何を判定してるのか
ということがわかれば、
if true == true
こんなバカな比較はしない
0092デフォルトの名無しさん2006/03/29(水) 16:23:10
>>89
いいや、お前がアホ。

お前が勝手にそういう状況の話に限定するのは勝手だが、
現実にtrueかどうかを比較するときは存在する。

よって、>>86は話にならんな。

>86が通用するなら、同様にnil?も否定できる

大前提として、
if obj == nil
とか書く奴はアホ。これはいいか?
よって、Object#nil? があるけど、
if obj.nil?
とか書く奴はアホ。 if !obj とかけ。

反論してきたら、>そういう状況の話をしているのでは無いことぐらい文脈からわかるだろ。アホか
と返せるなw
0093デフォルトの名無しさん2006/03/29(水) 16:24:38
>>92
ああ、結局屁理屈が言いたいだけか。スルーしていいね?
0094デフォルトの名無しさん2006/03/29(水) 16:24:45
>>91
つまりnil?も必要ないじゃん、ということで宜しいですね
0095デフォルトの名無しさん2006/03/29(水) 16:25:47
>>93
お前が屁理屈いうからだろ、死ねよバカ
0096デフォルトの名無しさん2006/03/29(水) 16:27:22
なんか何人もいてわけがわからんくなってきたね。

Object#true? や Object#false? はないのが自然と考える人もいる。
Integer#odd? や Integer#even? は存在するべきだと俺も思うが、
ない理由は「だってないんだもん」でしかないと思われる。

Object#nil? があるのは、false と nil が共に偽として扱われるから
nil は別途判定する必要があって、かつ、== 演算子はユーザーに
再定義されるものであるという前提があるためだろう。
0097デフォルトの名無しさん2006/03/29(水) 16:30:19
>false と nil が共に偽として扱われるから
>nil は別途判定する必要があって

とすると、trueとfalse,nil以外全てのobjectは真して扱われる以上、
それらも別途判定する必要はあるよな。
true?が存在してもよさそうな気がするな。
0098デフォルトの名無しさん2006/03/29(水) 16:32:31
質問を装って、ただひたすら自説を展開して聞く耳持たずって奴は
一番たち悪いな。
0099デフォルトの名無しさん2006/03/29(水) 16:33:13
>>97
true? false? よりは to_boolean の方がまだ使いでがある気がする。
0100デフォルトの名無しさん2006/03/29(水) 16:34:36
頻度の問題
0101デフォルトの名無しさん2006/03/29(水) 16:35:32
>>98
俺は質問者じゃないが、回答者のただひたすら自説を展開して
質問者に押し付けて聞く耳持たずって様が目障りだったんでね。
■ このスレッドは過去ログ倉庫に格納されています