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

Ruby 初心者スレッド Part 39

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2010/10/21(木) 10:06:13
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.2 は初心者には若干時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
 文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
 1.8.7 は 1.9 系の新機能のいくつかが利用可能なため、1.8.7 を習得すればスムーズに 1.9 系に移行できるでしょう。

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

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

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0951デフォルトの名無しさん2010/12/10(金) 20:34:37
>>949
見ない
それは Net::HTTP の仕事ではないというかそんな根底部分で余計なことすんなということらしい
open-uri ならヘッダの Content-Type を読んで force_encoding で設定してくれるが、

irb1.9> require 'open-uri'
irb1.9> p open("http://dailynews.yahoo.co.jp/").read.encoding
#<Encoding:EUC-JP>
irb1.9> p open("http://sankei.jp.msn.com/").read.encoding
#<Encoding:Shift_JIS>
irb1.9> p RUBY_VERSION
"1.9.2"

レスポンスヘッダの Content-Type ほど信用ならないものもないのでまあ掛け捨て保険程度
0952デフォルトの名無しさん2010/12/10(金) 20:46:25
なにもしない … Net::HTTP
Content-Type ヘッダの値を試す(エンコーディングエラーなら無視) … OpenURI
<meta> の charset と Content-Type ヘッダ と NKF.guess を試す … Mechanize

こんな感じだな
まあエンコーディングチェックのコストの関係で事実上の住み分けになってる
Mechanize は HTML を全文パースしてエンコーディング情報候補を探すから動作が他よりずっと重い

HTML が文字エンコーディング情報をヘッダでのみ記述するようになってれば楽だったのですが
http-equiv とかいうドヤ顔機能マジ氏ね
0953デフォルトの名無しさん2010/12/10(金) 21:31:44
ruby1.9.2からrequireを同ディレクトリ内のファイルを呼んでくれなくなる。
つまりRuby 1.9.2から$LOAD_PATHにカレントディレクトリが含まれなくなった。
require'./@@@@'
とするか、
require_relative'@@@@'
としなければならない。
古い参考書を読んでいてはまった。
0954デフォルトの名無しさん2010/12/10(金) 21:40:18
>>934
イディオムで

!!(式)

というのがある、これでtrueになるかfalseになるかわかるけど基本は >>936

irb> [-1, 0, 1, true, false, nil, [], "0"].map{|x| !!x}
=> [true, true, true, true, false, false, true, true]

メソッドでtrueかfalseかだけを返すことを明示したい時の使われているけど
記号的だしObject.to_boolがあればいいけど、長いよな
0955デフォルトの名無しさん2010/12/10(金) 21:48:03
module Object
  def is_true?
    !!self
  end
end

他の言語で言う if (flag == true) 並に恥ずかしいが
0956デフォルトの名無しさん2010/12/10(金) 21:49:21
ごめん適当に書いたら間違ってる
is_true?よりもRubyならtrue?の方がいいな
0957デフォルトの名無しさん2010/12/10(金) 21:55:57
ユニットテストってみんな標準のTest::Unit使ってるの?
それ以外の凄いのない?
0958デフォルトの名無しさん2010/12/10(金) 21:56:19
>>955-956
module Kernel
  def true?
    !!self
  end
end

require 'pp'
pp [-1, 0, 1, 0.0, 0.1, true, false, nil, [], "0", ""].map{|x| [x, x.true?]}
0959デフォルトの名無しさん2010/12/10(金) 21:57:48
>>955-956
irb> p (1 == true)
false

Ruby にとって true という呼び名はあまり意味がないので述語に入れるのは不適当
Object#nil? があっても Object#true? はない
non-nil みたいなもの
0960デフォルトの名無しさん2010/12/10(金) 21:59:37
>>957
もはやユニットテストではないかもsれんが

rspecが流行りか
あとはshoulda

受け入れテストはCucumber(とCucumberの記法がウザイ人のためのsteak)

今の流行りはここを参照しる
Testing frameworks in The Ruby Toolbox
http://ruby-toolbox.com/categories/testing_frameworks.html
0961デフォルトの名無しさん2010/12/10(金) 22:02:31
>>959
trueではないが、ifでは真と評価されるというくらいか
0962デフォルトの名無しさん2010/12/10(金) 22:03:58
>>934 が「条件式の所で数字を評価すると必ずtrueに」

「条件式の所で」つってんだろがw
09639572010/12/10(金) 22:04:39
すげー。ありがとうございます。勉強します。
でもどれが凄いのかわっぱりわからんw
0964デフォルトの名無しさん2010/12/10(金) 22:05:29
>>957
今の標準はminitestじゃね?
標準じゃなくて今は切り離されたTest::Unitは進化してるみたいだぞ
0965デフォルトの名無しさん2010/12/10(金) 22:07:21
>>963
BDDやTDDで最近の日付でググっとけ

書き捨てのスクリプトならともかく、テスト書かないとやっとれんし効率的なテスト書く方法しっとくと楽
0966デフォルトの名無しさん2010/12/11(土) 00:00:45
ifの式の中では#to_booleanを呼んで真偽判定すればいいのに。
んでnil.to_booleanすると「ぼっ僕は真でもない偽でもないよ!」って例外をあげればいい。
なんでnilも偽なんだからね!とか勝手にになっちゃうのかわからん。
nilさんがかわいそうだろ…そんなつもりじゃないのに偽とか決め付けたら。
0967デフォルトの名無しさん2010/12/11(土) 00:05:03
一応、本質的には nil だけなのだと思う
nil なら ELSE、それ以外は THEN という処理

真偽値で nil と non-nil だけだとわかりにくい人向けに false が作られた感じ、に見える
0968デフォルトの名無しさん2010/12/11(土) 00:11:51
もうわけわからん。
コードの世界2でも出して完全解説ヨロ。>マツモティーヌ
0969デフォルトの名無しさん2010/12/11(土) 00:14:27
非nil という概念を当たり前に思えるかが鍵なんだろうなあ
Ruby のスクリプトを書いてる人で明示的に false を返してる人は稀だと思う
0970デフォルトの名無しさん2010/12/11(土) 00:16:28
>>969
foo? みたいなのはメソッドの名称的に true か false を「返さないといけない」んで、きちんと書く

それ以外の if 条件になるメソッドの返り値なんかは nil かそうでないかの気遣いしかしないなー
0971デフォルトの名無しさん2010/12/11(土) 00:23:05
つまりこの世界にはnilか非nilしかないってこと?
0972デフォルトの名無しさん2010/12/11(土) 00:26:51
「該当がなかったらnilを返す」というメソッドがやたら多い理由でもあるね
ホントは、該当なしなら空文字列や空配列もでいいはずなのよ
でもそうせずに“失敗”時に nil を返すようにすると

foo() || var || baz()

みたいな混成の処理ができる
foo メソッドが空文字列を返すとか var は Hoge::EmptyData オブジェクトが入ってるとか
そういうのだととても困る
まさか false を入れとくわけにもいかないし
undef? ああその手もあるか
0973デフォルトの名無しさん2010/12/11(土) 00:35:30
>>972
んー…「該当がなかったらnilを返す」のは駄目なことなの?
例えばHashでキーに対応する値が無かったらnilを返すのは正しいとおもうんだど。
0974デフォルトの名無しさん2010/12/11(土) 00:37:54
>>973 よく読め
0975デフォルトの名無しさん2010/12/11(土) 00:39:17
>>973 よく書け
0976デフォルトの名無しさん2010/12/11(土) 00:40:00
゚(゚´ω`゚)゚。ピー
0977デフォルトの名無しさん2010/12/11(土) 00:42:34
undef は地獄なのでやめといたほーが…
0978デフォルトの名無しさん2010/12/11(土) 01:18:10
テストは
内部テストにRspec
外部テストにcucumber+capybara

0979デフォルトの名無しさん2010/12/11(土) 01:25:13
>>6のActiveScriptRuby 1.8.7が落とせない(サイトがなくなってる)のですが
どこか替わりのサイトはありますか?
0980デフォルトの名無しさん2010/12/11(土) 01:57:17
消える寸前に移転の情報を見た気がするが、Windows興味ないので
どこだか覚えてないや、ごめんな。
0981デフォルトの名無しさん2010/12/11(土) 02:15:13
いまならここだろ
RubyInstaller for Windows
http://rubyinstaller.org/
Downloads
http://rubyinstaller.org/downloads/
0982デフォルトの名無しさん2010/12/11(土) 02:50:29
>>978
artonさんのとこ
http://www.artonx.org/
0983デフォルトの名無しさん2010/12/11(土) 02:51:19
>>981のような人にはなりたくないと思う
移転先は>>256
>>981はMinGWなので初心者には勧めない
0984デフォルトの名無しさん2010/12/11(土) 03:16:24
中級者な人ならRubyInstallerのrubyのほうが速くていいんだけどね
RubyInstallerのほうはRuby以外にやらなければならないことがちと多すぎるな
Rubyに慣れて「拡張ライブラリ作るぜー」とかいう段になってから改めて乗り換えるので充分間に合う
0985デフォルトの名無しさん2010/12/11(土) 03:27:21
ゆくゆくはみんなmingwになるんだろうけどね…
っていうかmingw32対応してないような拡張ライブラリはそろそろ焼却炉で燃やしていい
いまだに RUBY_PLATFORM =~ /mswin/ も残ってるしやんなるな
0986デフォルトの名無しさん2010/12/11(土) 11:02:11
javascriptはnull, undefined, false が別々に存在するすばらしい言語
※ただしundefinedは予約語ではない
0987デフォルトの名無しさん2010/12/11(土) 11:04:44
+=だけ許可して=はNGにしたいのですが、どうやって書けばいいのでしょうか?

(1) foo.bar = hoge # NG
(2) foo.bar += hoge # 許可

Bar#+ と Foo#bar= を定義すると(2)はOKですが、(1)も同時にOKになってしまうのですが……
方法はない?
0988デフォルトの名無しさん2010/12/11(土) 11:07:32
>>987
許可も何も、ユーザーがメソッドを使用することを拒否することはできない
紛らわしい書き方するなと赤字で文書に書いておけ
0989デフォルトの名無しさん2010/12/11(土) 11:08:04
<< を使う。
0990デフォルトの名無しさん2010/12/11(土) 11:13:32
まあ別のメソッドを作るとか

class Foo
 def plus(n)
  @bar += n
 end
end
09919872010/12/11(土) 11:22:53
Rubyの中では
foo.bar += hoge を
foo.bar = (foo.bar + hoge)
で計算してますよね。そうすると代入を禁止することは無理っぽい。
そうだとすると>>989-990が言うように別のメソッドを定義するしかない。

いまいち追加っぽい気がしない?
foo.bar << hoge



0992デフォルトの名無しさん2010/12/11(土) 11:26:11
barの中には何が入ってんだよ
それ言わないとどうにもならんよ
0993デフォルトの名無しさん2010/12/11(土) 11:30:25
barは配列みたいに使う自分定義のクラス(中でC++の拡張ライブラリに飛ぶ)
現在こう書いているのを、
@world.add_child node
こう書きたい。
@world.child += node
でもこう書くのは不可能にしたい
@world.child = node
09949872010/12/11(土) 11:35:29
なんでRubyは+と=は演算子なのに+=は制御構造なんだよ。
仕様おかしいよ。matz変えてー
0995デフォルトの名無しさん2010/12/11(土) 11:41:15
+と=と+=を全部定義するの面倒くさいから
0996デフォルトの名無しさん2010/12/11(土) 11:43:36
どちらにしろ+=だけ使うような変な使い方は止めた方が良い
四則演算子の定義は、数値を表現するクラス以外で使わない方が良い
09979872010/12/11(土) 11:56:32
標準の配列も要素を追加するのに+=は使えないしね。
ar = [1,2,3]
ar += 4
./main.rb:8:in `+': can't convert Fixnum into Array (TypeError)
おとなしく << 使うことにします。ありがとうございました。
0998デフォルトの名無しさん2010/12/11(土) 12:25:35
+=の意味で<<使うのはよくなくなくない?
普通は再代入と破壊で意味ちがうし
0999デフォルトの名無しさん2010/12/11(土) 13:06:35
text = ''.tap do |t|
t += い
t += ろ
t += い
t += ろ
end
ってやって、textが '' だったので3分ほど悩んだなぁ。
1000デフォルトの名無しさん2010/12/11(土) 13:07:26
いや、意味的に += じゃないから、
この場合、<< にしろよ、が正しいと思う
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。