Ruby 初心者スレッド Part 39
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2010/10/21(木) 10:06:13★注意★ 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見ない
それは 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:25Content-Type ヘッダの値を試す(エンコーディングエラーなら無視) … OpenURI
<meta> の charset と Content-Type ヘッダ と NKF.guess を試す … Mechanize
こんな感じだな
まあエンコーディングチェックのコストの関係で事実上の住み分けになってる
Mechanize は HTML を全文パースしてエンコーディング情報候補を探すから動作が他よりずっと重い
HTML が文字エンコーディング情報をヘッダでのみ記述するようになってれば楽だったのですが
http-equiv とかいうドヤ顔機能マジ氏ね
0953デフォルトの名無しさん
2010/12/10(金) 21:31:44つまりRuby 1.9.2から$LOAD_PATHにカレントディレクトリが含まれなくなった。
require'./@@@@'
とするか、
require_relative'@@@@'
としなければならない。
古い参考書を読んでいてはまった。
0954デフォルトの名無しさん
2010/12/10(金) 21:40:18イディオムで
!!(式)
というのがある、これで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:03def is_true?
!!self
end
end
他の言語で言う if (flag == true) 並に恥ずかしいが
0956デフォルトの名無しさん
2010/12/10(金) 21:49:21is_true?よりもRubyならtrue?の方がいいな
0957デフォルトの名無しさん
2010/12/10(金) 21:55:57それ以外の凄いのない?
0958デフォルトの名無しさん
2010/12/10(金) 21:56:19module 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:48irb> p (1 == true)
false
Ruby にとって true という呼び名はあまり意味がないので述語に入れるのは不適当
Object#nil? があっても Object#true? はない
non-nil みたいなもの
0960デフォルトの名無しさん
2010/12/10(金) 21:59:37もはやユニットテストではないかも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:31trueではないが、ifでは真と評価されるというくらいか
0962デフォルトの名無しさん
2010/12/10(金) 22:03:58「条件式の所で」つってんだろがw
0963957
2010/12/10(金) 22:04:39でもどれが凄いのかわっぱりわからんw
0964デフォルトの名無しさん
2010/12/10(金) 22:05:29今の標準はminitestじゃね?
標準じゃなくて今は切り離されたTest::Unitは進化してるみたいだぞ
0965デフォルトの名無しさん
2010/12/10(金) 22:07:21BDDやTDDで最近の日付でググっとけ
書き捨てのスクリプトならともかく、テスト書かないとやっとれんし効率的なテスト書く方法しっとくと楽
0966デフォルトの名無しさん
2010/12/11(土) 00:00:45んでnil.to_booleanすると「ぼっ僕は真でもない偽でもないよ!」って例外をあげればいい。
なんでnilも偽なんだからね!とか勝手にになっちゃうのかわからん。
nilさんがかわいそうだろ…そんなつもりじゃないのに偽とか決め付けたら。
0967デフォルトの名無しさん
2010/12/11(土) 00:05:03nil なら ELSE、それ以外は THEN という処理
真偽値で nil と non-nil だけだとわかりにくい人向けに false が作られた感じ、に見える
0968デフォルトの名無しさん
2010/12/11(土) 00:11:51コードの世界2でも出して完全解説ヨロ。>マツモティーヌ
0969デフォルトの名無しさん
2010/12/11(土) 00:14:27Ruby のスクリプトを書いてる人で明示的に false を返してる人は稀だと思う
0970デフォルトの名無しさん
2010/12/11(土) 00:16:28foo? みたいなのはメソッドの名称的に true か false を「返さないといけない」んで、きちんと書く
それ以外の if 条件になるメソッドの返り値なんかは nil かそうでないかの気遣いしかしないなー
0971デフォルトの名無しさん
2010/12/11(土) 00:23:050972デフォルトの名無しさん
2010/12/11(土) 00:26:51ホントは、該当なしなら空文字列や空配列もでいいはずなのよ
でもそうせずに“失敗”時に nil を返すようにすると
foo() || var || baz()
みたいな混成の処理ができる
foo メソッドが空文字列を返すとか var は Hoge::EmptyData オブジェクトが入ってるとか
そういうのだととても困る
まさか false を入れとくわけにもいかないし
undef? ああその手もあるか
0973デフォルトの名無しさん
2010/12/11(土) 00:35:30んー…「該当がなかったらnilを返す」のは駄目なことなの?
例えばHashでキーに対応する値が無かったらnilを返すのは正しいとおもうんだど。
0974デフォルトの名無しさん
2010/12/11(土) 00:37:540975デフォルトの名無しさん
2010/12/11(土) 00:39:170976デフォルトの名無しさん
2010/12/11(土) 00:40:000977デフォルトの名無しさん
2010/12/11(土) 00:42:340978デフォルトの名無しさん
2010/12/11(土) 01:18:10内部テストにRspec
外部テストにcucumber+capybara
0979デフォルトの名無しさん
2010/12/11(土) 01:25:13どこか替わりのサイトはありますか?
0980デフォルトの名無しさん
2010/12/11(土) 01:57:17どこだか覚えてないや、ごめんな。
0981デフォルトの名無しさん
2010/12/11(土) 02:15:13RubyInstaller for Windows
http://rubyinstaller.org/
Downloads
http://rubyinstaller.org/downloads/
0982デフォルトの名無しさん
2010/12/11(土) 02:50:29artonさんのとこ
http://www.artonx.org/
0983デフォルトの名無しさん
2010/12/11(土) 02:51:19移転先は>>256
>>981はMinGWなので初心者には勧めない
0984デフォルトの名無しさん
2010/12/11(土) 03:16:24RubyInstallerのほうはRuby以外にやらなければならないことがちと多すぎるな
Rubyに慣れて「拡張ライブラリ作るぜー」とかいう段になってから改めて乗り換えるので充分間に合う
0985デフォルトの名無しさん
2010/12/11(土) 03:27:21っていうかmingw32対応してないような拡張ライブラリはそろそろ焼却炉で燃やしていい
いまだに RUBY_PLATFORM =~ /mswin/ も残ってるしやんなるな
0986デフォルトの名無しさん
2010/12/11(土) 11:02:11※ただしundefinedは予約語ではない
0987デフォルトの名無しさん
2010/12/11(土) 11:04:44(1) foo.bar = hoge # NG
(2) foo.bar += hoge # 許可
Bar#+ と Foo#bar= を定義すると(2)はOKですが、(1)も同時にOKになってしまうのですが……
方法はない?
0988デフォルトの名無しさん
2010/12/11(土) 11:07:32許可も何も、ユーザーがメソッドを使用することを拒否することはできない
紛らわしい書き方するなと赤字で文書に書いておけ
0989デフォルトの名無しさん
2010/12/11(土) 11:08:040990デフォルトの名無しさん
2010/12/11(土) 11:13:32class Foo
def plus(n)
@bar += n
end
end
0991987
2010/12/11(土) 11:22:53foo.bar += hoge を
foo.bar = (foo.bar + hoge)
で計算してますよね。そうすると代入を禁止することは無理っぽい。
そうだとすると>>989-990が言うように別のメソッドを定義するしかない。
いまいち追加っぽい気がしない?
foo.bar << hoge
0992デフォルトの名無しさん
2010/12/11(土) 11:26:11それ言わないとどうにもならんよ
0993デフォルトの名無しさん
2010/12/11(土) 11:30:25現在こう書いているのを、
@world.add_child node
こう書きたい。
@world.child += node
でもこう書くのは不可能にしたい
@world.child = node
0994987
2010/12/11(土) 11:35:29仕様おかしいよ。matz変えてー
0995デフォルトの名無しさん
2010/12/11(土) 11:41:150996デフォルトの名無しさん
2010/12/11(土) 11:43:36四則演算子の定義は、数値を表現するクラス以外で使わない方が良い
0997987
2010/12/11(土) 11:56:32ar = [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:35t += い
t += ろ
t += い
t += ろ
end
ってやって、textが '' だったので3分ほど悩んだなぁ。
1000デフォルトの名無しさん
2010/12/11(土) 13:07:26この場合、<< にしろよ、が正しいと思う
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。