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

Ruby 初心者スレッド Part 41

■ このスレッドは過去ログ倉庫に格納されています
0001京 ◆SsSSsSsSSs 2011/02/10(木) 13:47:51
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.2 は初心者には若干時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
 文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
 迷う点の少ない1.8.7に習熟→おもむろに1.9.2の変更点のみ重点学習、とすればスムーズに移行できるでしょう。

関連スレや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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0757デフォルトの名無しさん2011/04/08(金) 23:44:25.39
>>756
PHPでできるんだからRubyなんてやる必要ないだろ
0758デフォルトの名無しさん2011/04/09(土) 00:44:44.48
そうなんだよな
他言語経験者がi++とか○○は当然あるに違いないと思ってたものがなかったり
privateとか微妙に意味が違ったりすると戸惑うよな
0759デフォルトの名無しさん2011/04/09(土) 01:38:24.34
>>723
WindowsでRuby使おうとしたら
インストールするところで何選んで良いか判らなくて躓いたわ
0760デフォルトの名無しさん2011/04/09(土) 07:02:53.15
>>757
うむ
冗長なAでできるから端的なBいらないじゃんをつきつめるとRubyは使われない可能性は高いw
0761デフォルトの名無しさん2011/04/09(土) 07:11:33.11
Ruby ではループカウンタはまず使わない
Array#each か Hash#each のイテレーションを使うかまたは>>755みたいに整数でくるくる回す
配列の内容全部が必要なのなら、添え字アクセスはひとまず忘れて、each する構造にできないかを最初に考える

>>759
アレで理解できる一握りの人だけが Windows で Ruby を使うことができます
>>5でいいと思うけどね
0762デフォルトの名無しさん2011/04/09(土) 09:46:39.56
>>759
だいたいの場所で、ActiveScriptRubyが第1のお薦めになってない?
まあ今はRubyInstallerとかRumixとか、他にも候補あるから迷うのはわかるが
0763デフォルトの名無しさん2011/04/09(土) 09:49:29.76
>>759
WindowsでRubyは
http://rubyinstaller.org/
が定番だと思うよ
0764デフォルトの名無しさん2011/04/09(土) 10:29:03.39
http://rubyinstaller.org/downloads/とhttp://rubyforge.org/frs/?group_id=167って中身同じなの?
0765デフォルトの名無しさん2011/04/09(土) 10:30:48.63
まだ定番とはいえないだろう
英語だし、mingw版だし
「次の選択肢」くらいの位置になってるとは思うけど
0766デフォルトの名無しさん2011/04/09(土) 10:43:57.20
rubyinstallerで入れてgemをupdateしてpikいれてaddが一番楽だったな
0767デフォルトの名無しさん2011/04/09(土) 11:27:28.10
>>764
URLが同じなら同じだろう

というかオフィシャルサイトのダウンロードページだけにするのが筋だな
rubyforgeのページ見せられてオフィシャルだと判断できるような人はおらん
単純に>>731のスジが悪い
0768デフォルトの名無しさん2011/04/09(土) 11:38:42.79
Ruby1.9.2

a = 123.45
b = a.to_a
puts b

実行するとundefined method `to_a' for 123.45:Float (NoMethodError)エラーになるのは何故ですか?
0769デフォルトの名無しさん2011/04/09(土) 11:43:25.04
Floatクラスにto_aが無いよってエラーに書いてあるよね
0770デフォルトの名無しさん2011/04/09(土) 11:46:38.41
過去には Object#to_a があったのだが、なくなった。
0771デフォルトの名無しさん2011/04/09(土) 11:48:50.25
ていうか Hash 以外の to_a の存在は忘れてくれ
古い解説ではもやもやしたベンリ機能のように書いてあることがあるんだが、
Object#to_a は今後使用しないことになったので [ ] で括ってリテラルで書いてくれ
a = 123.45
b = [a]
p b

配列っぽくなりうる Hash を to_a するのはアリだが、
h = {'k1' => 'v1', 'k2' => 'v2'}
p h.to_a

それ以外の「ひとつしかない」オブジェクトを to_a するのはダメ
0772デフォルトの名無しさん2011/04/09(土) 11:50:59.06
>>766
それが楽だと思うんだけどね
まず初めての人なら"pik入れてadd"のところはのちのちでいいかもしれない

>>768
ruby 1.8でもなくなるって警告出てたんだけどな
warning: default `to_a' will be obsolete
0773デフォルトの名無しさん2011/04/09(土) 11:57:37.06
こんにちは質問させてください!!

RubyGemsでインストールすると古くて動かないようなrubyで作られた便利なプログラムがある時に
最新版やforkされたソース(主にgitリポジトリから取得)だと動くことがあります
すかし、そのようなプログラムはRubyGemsのディレクトリ構成のせいか、
(便利プログラム)/bin/以下のファイルを/usr/local/binのようなパスを通った場所においても
`require': no such file to load
になり動いてくれません。

絶対パスだと動くようなのでaliasを作ればいいのですが、
一般的にこのようなRubyGemsの構造をしたプログラムの最新版のソースから利用するときの
ベストプラクティスは何かありますでしょうか?
bundler??とかいうのを使うのでしょうか
0774デフォルトの名無しさん2011/04/09(土) 11:58:39.72
> (便利プログラム)/bin/以下のファイルを/usr/local/binのようなパスを通った場所においても
> `require': no such file to load
> になり動いてくれません。

(便利プログラム)/bin/以下のファイルを/usr/local/binのようなパスを通った場所にシンボリックリンクをおいても

の間違いでした
0775デフォルトの名無しさん2011/04/09(土) 12:04:47.34
これからRubyを学ぶものは1.9から始めたほうがいいんだよね
0776デフォルトの名無しさん2011/04/09(土) 12:10:09.04
ふつうに gem コマンドでインストールすると、パスの通った位置に、
(便利プログラム)/bin/以下のファイル
をloadするスクリプトがインストールされる。たとえば、
~/.gem/ruby/1.9.1/gems/bundler-1.0.10/bin/bundle をロードする
~/.gem/ruby/1.9.1/bin/bundle (こっちはパスが通っている)
みたいな関係。

後者はどのgemでもほぼ同じだから、まねして作ってやればよい。

あるいは、ソースを取ってこれるのだから、rakeでgemを作って(ターゲットは
gemとかpackageとかpkgとかいろいろ)、
gem install --local でインストールしてもよい。
0777デフォルトの名無しさん2011/04/09(土) 12:11:08.95
>>773
git clone https://github.com/user/hogehoge
cd hogehoge/
rake pkg
gem install pkg/hogehoge-1.0.1.gem

rake pkg は rake build かもしれない
ようは開発版のソースから gem パッケージを手元で生成してインストールしてしまうという荒業
バージョン番号が同じだと既存の hogehoge-1.0.1 が上書きされるので、 rake で適当にバージョン上げれ

>>775
>>695-704
0778デフォルトの名無しさん2011/04/09(土) 12:14:49.97
1.9から始めて心が折れないとよいが
0779デフォルトの名無しさん2011/04/09(土) 12:16:28.69
勉強になりました
ありがとうございます
0780デフォルトの名無しさん2011/04/09(土) 12:27:12.86
rubygems が bundler を内部で使うようになってから gem install に毎回5分くらいかかるんですが
なんか回避方法はありませんか
0781デフォルトの名無しさん2011/04/09(土) 12:32:05.25
>>780
それは単にBundlerの展開データ量に実メモリが追いついてないんだろう
gem installを行うためには空きメモリが200MBくらい必要

ちなみに必要となるのはそのうちの2KBくらいのデータだ
それを探すために公開されてる全データを取得して展開してサーチしてる
07827592011/04/09(土) 12:35:31.69
こんなにいっぱいレスもらえるとは思いませんでした
みなさん本当にありがとうございました
0783デフォルトの名無しさん2011/04/09(土) 12:47:32.61
Rubyってbasicみたいだよね
何かVBやってるみたい
C#派ならPHPか!?
0784デフォルトの名無しさん2011/04/09(土) 13:00:02.77
コレクションとイテレーションとオブジェクトとメソッドコールが言語中枢を侵してるRubyと同じって
なんかずいぶん先進的なBasicやってたんだな
0785デフォルトの名無しさん2011/04/09(土) 14:25:02.28
>>781
gem作った人ってストリームって知らないの?
0786デフォルトの名無しさん2011/04/09(土) 15:10:01.81
>>785
そんなもの必要ないだろ
サーバの負担にもならないし、全部メモリに展開したほうが早い
0787デフォルトの名無しさん2011/04/09(土) 15:25:44.70
まあ、ああいうのは開発者さんの環境ではサクサク動くのだろうとは思う
0788デフォルトの名無しさん2011/04/09(土) 16:09:19.50
>>771
Enumerable#to_a は別名があるとはいえ、別に忘れなくても良いと思うんだ…
0789デフォルトの名無しさん2011/04/09(土) 22:11:31.08
>>786
swapがないVPSでgemがインストールできなかった当時の全俺がないた
0790デフォルトの名無しさん2011/04/09(土) 22:18:01.58
そもそものgemクライアントとして、こんなにたくさんのgemが登録されることを予期してはいなかった
だから途中で破綻するはずだったんだが、間の悪いことに開発者のマシンがスペックアップしたので
本当なら遅くなって使い物にならなくなるはずのシステムが普通に使えてしまった

世の中そんなもんだよね
0791デフォルトの名無しさん2011/04/09(土) 22:20:20.92
だれかgemをフォークして作り直してくれ。
Pythonで。
0792デフォルトの名無しさん2011/04/09(土) 22:26:44.55
eggじゃだめなん?
0793デフォルトの名無しさん2011/04/09(土) 23:40:49.80
>>752
お帰りください
0794デフォルトの名無しさん2011/04/10(日) 06:42:01.76
いやいや、i++で1増えるほうが気持ち悪いから。
ってかこれこれ誰が考えたんだよ。
C言語作った奴か?
0795デフォルトの名無しさん2011/04/10(日) 07:02:40.24
まあオブジェクト指向が机上の空論か学者のオモチャだったころのイケてるフィーチャーだったものなので
現在のRubyのようにイテレータがきちんと枚挙をサポートしてれば出番は確実に減る
0796デフォルトの名無しさん2011/04/10(日) 07:36:51.42
i++はC++からだったと思う
0797デフォルトの名無しさん2011/04/10(日) 08:39:36.13
i++ はCが考案されたときPDP-11のアセンブラ命令にそのまま落とせて便利じゃね?
と思って作られたもの。
0798デフォルトの名無しさん2011/04/10(日) 09:03:51.43
うそつくな。B言語にあるじゃないか。
http://cm.bell-labs.com/cm/cs/who/dmr/kbman.html
0799デフォルトの名無しさん2011/04/10(日) 09:15:30.57
http://cm.bell-labs.com/cm/cs/who/dmr/chist.html

> Thompson went a step further by inventing the ++ and -- operators, [...].
> They were not in the earliest versions of B, but appeared along the way.

訳)ケンは大きいつづらを、リッチーは小さなつづらを選びました。
すると中には黄金虫が
0800デフォルトの名無しさん2011/04/10(日) 10:35:35.16
Cの次はPといううわさが大昔にあったな。
0801デフォルトの名無しさん2011/04/10(日) 10:49:37.97
class Test
def a()
return b()
end
def b()
return "bbbb"
end
private :b
end

test = Test.new()
puts test.a()

メソッドaはpublic、メソッドbはprivate。
メソッドaからメソッドbを呼び出せて、メソッドbを直接呼び出したらエラーになるようにしたいと思います。
Ruby1.9.2です。
この書き方で合ってますでしょうか?
特にprivateの仕方はマニュアルの通りに書いたのですが、サイトによっては
ttp://www.nslabs.jp/access-control.rhtmlのように
private
def pri
p true
end
と書いたり,
ttp://blog.s21g.com/articles/561のように
class Foo
def self.bar
end
private_class_method :bar
end
と書いたりしてあってどれが正しいのか判断できません
0802デフォルトの名無しさん2011/04/10(日) 11:02:40.64
>>801
まず、private について。
privateは、引数なしで呼ばれた場合は、その後のメソッドが全てprivateになる。
引数をつけて呼ばれた場合は、引数のメソッドをprivateにする。
なので、その例ではどちらでもbをprivateにできる。

んで、private_class_method だけは意味が違う。
それは通常のメソッドではなく
クラスメソッド(Testから作ったオブジェクトではなく「Test自体」が持つメソッド)をprivateにするもの。
0803デフォルトの名無しさん2011/04/10(日) 11:04:59.76
追記。
class Foo
def self.bar

という記述は、さっき上に書いたように
「Fooから作ったオブジェクト」ではなく「Foo自体」のメソッドを定義する書き方。
だからprivateにするのに、private_class_methodを使っている。
0804デフォルトの名無しさん2011/04/10(日) 12:13:49.92
privateって構文じゃなくてメソッドだったのか
しらんかた
0805デフォルトの名無しさん2011/04/10(日) 12:37:14.78
ということはprivate_class_methodを使っておけば間違いないという事であってますか?
0806デフォルトの名無しさん2011/04/10(日) 13:18:40.65
いいえ

メソッドのアクセス制限を利用したいなら、
Rubyにおけるメソッドの所属の仕組みの知識は必須になるます
既存言語と違うというだけで、わかってしまえばたいしたことないので、ちょっと時間割いてくださせ
0807デフォルトの名無しさん2011/04/10(日) 13:28:52.20
若干の語弊あり

・ Ruby には オブジェクトに属するインスタンスメソッドというものしかない
・ Ruby のクラスは、Class クラスのオブジェクトを定数で呼んでるだけである
   String クラスは、 STRING = Class.new{ なんか色々設定 } にコンセプト上は同一
   irb> p String.class #=> Class
・ クラスもオブジェクトなので、それに属するインスタンスメソッドというのもありえる
・ クラスに属するインスタンスメソッドなので、じゃあクラスメソッドって呼ぶことにしようぜ

ということで、クラスメソッドはクラス自体を self とするインスタンスメソッドだ
private_class_method は、書かれた文脈からわざわざクラスメソッドを探して private を実行する

てことで、どれも必要っちゃ必要。用途は>>802
メソッド定義の書き方を工夫して private 1個で済ます人のほうが多いかなという印象
0808通報オタク君2011/04/10(日) 13:52:20.37
>amachang 今粛々と民事刑事の方面で進めています。一応、すべて証拠として保存しなければいけないので、冗談でも今はこのスレに変なこと書き込まないでください。
>2011/01/28


http://hibari.2ch.net/test/read.cgi/prog/1291518728/

>1 :amachang撲滅振興協議会:2010/12/05(日) 12:12:08
> amachangが憎い・・・・amachangが許せない・・・・

> ククク・・・・クククククク・・・・・
> クックックックックックックッ・・・・・
> クー、クー、クー、クー、クー、クー・・・・・
>
> もう許せない。
> もはや沸き上がる滅意を抑えることが出来ない!!!
0809デフォルトの名無しさん2011/04/10(日) 15:53:03.95
■test.xml
<?xml version="1.0"?>
<root>
<item>
<title>Ruby</title>
<date>2011/04/10 12:15:22</date>
</item>
<item>
<title>Java</title>
<date>2011/03/25 21:38:57</date>
</item>
</root>
■test.rb
require "rexml/document"
file = File.new("test.xml")
xml = REXML::Document.new(file)
puts xml.elements['root/item[2]/title']

これでxmlからJavaというデータを取得できるのですが
このJavaの部分をPythonに書き換えるには何を使えば良いのでしょうか?
検索しても新たに追加する方法は見つかるのですが更新・書き換え方法が見つかりません
0810デフォルトの名無しさん2011/04/10(日) 16:05:32.98
xml.elements['root/item[2]/title'].text = 'Python' とかありそうな予感
0811デフォルトの名無しさん2011/04/10(日) 16:14:58.46
おお!すごいですね!
Rubyって簡単にxmlの操作ができますね
これで更新は出来たのですが、PHPののDOM関数のように書き換えと同時にxmlに書き込んでるわけではないのですね
データの追加・更新をしたら
fp = open(ファイル名, "w")
fp.print xml
fp.close
って書き込まないとダメってことでしょうか?
0812デフォルトの名無しさん2011/04/10(日) 16:26:36.17
うん。メモリ上のXMLツリーをいじくってるだけなので
いじりおわったらファイルに自分で書き出す
0813デフォルトの名無しさん2011/04/10(日) 16:30:07.50
勉強になりました
ありがとうございます
0814デフォルトの名無しさん2011/04/10(日) 20:19:27.43
utf-8のwebページを取ってきて、取ってきたページをscanで特定の文字列を抜き取りました。
抜き取った文字列をputsしたときに以下のエラーが出たのですがどのように解決したらよいでしょうか?
スクリプトファイルはUTF-8で保存してあり、ファイルの先頭には
# -*- encoding: utf-8 -*-
$stdout.set_encoding(Encoding::Windows_31J, Encoding::UTF_8)
と書いてます。


`write': "\xE5" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to Windows-31J (Encoding::UndefinedConversionError)
0815デフォルトの名無しさん2011/04/10(日) 22:18:31.36
ハッシュの値で検索かけて、該当するキーを全て取得したいです(Ruby1.8.7)

hash = {:a => 1 ,:b => 1 ,:c => 2}
p hash.index(1) #=> :a

:aと:bが配列になって返ってきてくれると嬉しかったのですが、いずれか一つしか返ってこないようです
全て返ってくるメソッドってないでしょうか?
0816デフォルトの名無しさん2011/04/10(日) 23:23:58.75
たぶん無かったと思う。find_allとか使って何とかしたほうがいいんじゃないかな
0817デフォルトの名無しさん2011/04/10(日) 23:27:39.18
hash.select{|_,v| v == 1}.map{|k,_| k }
でもいいんじゃない
0818デフォルトの名無しさん2011/04/10(日) 23:30:25.06
http://rubyforge.org/frs/?group_id=167で配布されているrubyinstaller-1.9.2-p180.exeを使ったのですが
Ruby/tkが入っていませんでした
gemでtkを入れたいのですがパッケージ名は何になりますでしょうか?
gem tkでは入れられませんでした
0819デフォルトの名無しさん2011/04/11(月) 01:20:23.64
>>818
そりゃそうだろうな、入ってるはずはない
オフィシャルにいくとインストーラーがあるのでそれ使わせてもらえ
0820デフォルトの名無しさん2011/04/11(月) 01:47:17.31
ねむい

>>814
ttp://doc.ruby-lang.org/ja/1.9.2/method/String/i/encode.html

その設定をしてputs時にUndefinedConversionErrorということは、
puts対象の文字列をUTF-8からWindows-31Jにしようとしたけど
Windows-31Jにできない文字が含まれていましたごめんなさい指示くださいということだろう
その文字が具体的に何かは知らん

正規表現での切り出しが間違っていないのなら
(たとえばUTF-8でファイルに書き出してエディタで読むと文字化けなしとか)、
String#encodeを直接使うしかない
puts の前で str.encode!(::Encoding::Windows_31J, :undef => :replace) とかしろ
0821デフォルトの名無しさん2011/04/11(月) 01:52:03.35
>>817
selectとdetectとcollectとrejectとinjectは紛らわしいから使用禁止じゃムキー
0822デフォルトの名無しさん2011/04/11(月) 01:57:53.45
injectはいいセンスだと思う
関数型言語みたいにfoldlでもいいような気もするけど、
あえて挿し込むというイメージを持たせた辺りはRubyらしい
0823デフォルトの名無しさん2011/04/11(月) 02:10:20.47
select, collec, injectとかはSmalltalkでしょ
08248222011/04/11(月) 03:20:13.24
そうだったのかッ!! 長年の謎が解けた
0825デフォルトの名無しさん2011/04/11(月) 08:21:54.09
injectは書き方が違うのでパッと見でも区別できる
他は無理だな
0826デフォルトの名無しさん2011/04/11(月) 11:30:40.41
hash.reject{|_,v| v != 1}.keys
という書き方あるな。でも欲しい条件が真じゃなくて、
要らない条件を書くからパッと見分かりづらいな駄目だこりゃ
rejectだけEnumerableじゃなくてHashクラスにあるからハッシュ返すのね
0827デフォルトの名無しさん2011/04/11(月) 12:26:08.18
REXMLで要素を追加するときに改行やインデントも入れたいのですが出来ませんか?
libxmlに乗り換えるべきでしょうか?
0828デフォルトの名無しさん2011/04/11(月) 12:28:30.24
rootに追加すると

<?xml version='1.0'?>
<root>
<item name='Ruby'><date>Mon Apr 11 12:25:20 2011</date></item></root>

と、なるので

<?xml version='1.0'?>
<root>
 <item name='Ruby'>
   <date>Mon Apr 11 12:25:20 2011</date>
 </item>
</root>
(インデント部分はタブとと考えてください)
としたい
0829デフォルトの名無しさん2011/04/11(月) 13:24:59.10
要素を追加するたびに改行やインデントをいれるんじゃなくて
操作しおわった最後の(直列化する)段階で清書するなら

doc = REXML::Document.new(...)
...
pprinter = REXML::Formatters::Pretty.new(4) # スペース4つでインデント
pprinter.write(doc, $stdout) # 標準出力$stdoutに書き出し

出力先は$stdout以外にFileインスタンスなんかでもOK
doc.write($stdout, 4)でもいけるんだけど今は廃止されてるとか

文字列で清書の結果を受け取る場合はとりあえずの方法
require 'stringio'
f = StringIO.new
pprinter.write(doc, f)
print f.string
0830デフォルトの名無しさん2011/04/11(月) 13:39:53.73
まさしく検索で見つかったdoc.writeでやってしまいました
Formattersのほう使わせて頂きます
ありがとうございます
0831デフォルトの名無しさん2011/04/11(月) 14:14:56.83
■test.rb
require "class1"
class1 = Class1.new()
puts class1.a()

■class.rb
class Class1
def a()
return "aaa"
end
end

クラスファイルを外部に残して、使いたいときにメインファイルから呼び出して使いたいのですが
test.rbのrequireの所でエラー(`require': no such file to load)になります
どちらのファイルも同じフォルダに入っています
どのように外部ファイルを読み込めるのでしょうか?
0832デフォルトの名無しさん2011/04/11(月) 14:17:52.22
すみません
require "./class1.rb"
としたら読み込めました

何故require "./class1.rb"じゃないと読み込めないのでしょうか?
何故require "class1.rb"とrequire "./class1.rb"は同じフォルダのクラスを指してないのですか?
0833デフォルトの名無しさん2011/04/11(月) 14:22:52.82
$LOAD_PATHにカレントディレクトリが含まれてないとか?
0834デフォルトの名無しさん2011/04/11(月) 14:29:58.23
というか1.9では最近含まれなくなった
0835デフォルトの名無しさん2011/04/11(月) 14:41:53.59
test というファイル名や Test というクラス名はあまりよくない
実害は少ないとは思うのだが

>>832
require は $LOAD_PATH の中から該当するファイルを探して読み込むのだが、
Ruby 1.9.2 からは $LOAD_PATH からカレントディレクトリが取り除かれたので
カレントディレクトリの自作ファイルを require 一発では読み込めなくなった

ただ、require でカレントディレクトリのファイルを読む事故の防止のために外してるだけなので
(たとえば、カレントディレクトリに瓜の情報を書いた uri.rb というファイルを置いて
require 'uri' すると、URL 用の組み込みの URI クラスがそれ以降どうやっても読めない)

 ・ 相対パスですとパスで明示して require './class1.rb' と書く
 ・ require_relative 'class1' と書いて、書いたファイルからの相対パスで探してもらう

ということは何も問題ない
1.9.1 以前でも動作する前者が人気
0836デフォルトの名無しさん2011/04/11(月) 15:04:20.11
line = STDIN.gets
case line
when 1
puts "1"
when 2
puts "2"
else
puts "none"
end

1と2を入力してもnoneが表示されます
どこか間違えてるのかアドバイスお願いします
0837デフォルトの名無しさん2011/04/11(月) 15:08:58.80
1.9を使っているので相対パスで./など明示的に書くクセを付けようと思います
あとFile.dirname(__FILE__) + "/class1.rb"と書く方法もあったので、気分に応じてプロジェクト毎に使い分けたいと思います
ありがとうございます
0838デフォルトの名無しさん2011/04/11(月) 15:21:14.88
>>836
標準入力から返ってくるものは文字列なので、 整数 1 にも整数 2 にもマッチしないので else に着く

あと標準入力は今は STDIN ではなく $stdin を使うほうがいい
0839デフォルトの名無しさん2011/04/11(月) 15:23:03.33
>>836
思ったとおりに動かない場合は

line = STDIN.gets
p line # <--
case line

とかする癖をつけるといいよ
0840デフォルトの名無しさん2011/04/11(月) 15:27:36.34
改行がくっついてるなんて思いませんでした
pってデバッグの役割みたいなものなんですね便利ですねこれは

line = $stdin.gets
case line
when "1\n"
puts "1"
when "2\n"
puts "2"
else
puts "none"
end

1\nって書くのが気持ち悪いけどRubyはこういうもなんだと言い聞かせるしかないですね
0841デフォルトの名無しさん2011/04/11(月) 16:11:23.87
IO#gets は行志向だから、「行」の文字列が丸ごと返る
行って言うくらいだから、もちろん改行つきだ
改行が不要な場合、ふつうは String#chomp する

line = $stdin.gets.chomp
case line
when "1"
puts "one"
when "2"
puts "two"
else
puts "none"
end
0842デフォルトの名無しさん2011/04/11(月) 16:35:44.81
他の言語の一行読むメソッドは行末の改行を削るものもあるから
もちろんとは言えないよ
0843デフォルトの名無しさん2011/04/11(月) 17:18:52.05
行は改行記号を含むだろ普通
Rubyのgetsは通常の行の概念に沿ってるというだけの話
0844デフォルトの名無しさん2011/04/11(月) 17:21:16.12
getsといえばC言語のgetsが真っ先に思い浮かぶなー
0845デフォルトの名無しさん2011/04/11(月) 17:48:19.75
ダンディ坂野
0846デフォルトの名無しさん2011/04/11(月) 18:04:50.59
>>843
テキストファイルの末尾が改行で終わらない場合は?
行は普通改行を含むものとしてもメリットはないと思うけどな
含んだり含まなかったりする、としておくほうが無難
0847デフォルトの名無しさん2011/04/11(月) 20:00:13.90
Ruby1.9.1でファイルを書き込みモードで開くときは
f = File::open("sample.txt", "w")とf = open("sample.txt", "a")どちらで書く事が推奨されてますか?
好みの問題であればFile::は省略しようと思います
0848デフォルトの名無しさん2011/04/11(月) 20:40:34.65
openをFile::openの略だと思っているのならそれは間違い。
0849デフォルトの名無しさん2011/04/11(月) 20:59:09.35
モード w とモード a もそもそも別物
0850デフォルトの名無しさん2011/04/12(火) 13:58:10.10
RubyでIEで開いたページ内のフォームにタイピングするマクロを作りたいのですが
どのようなキーワードで検索したらよいのでしょうか?
以前、過去スレ(過去半年分)でそういうやりかたが書いてあったのを記憶しているのですが見つかりませんでした
0851デフォルトの名無しさん2011/04/12(火) 14:01:27.08
watir
0852デフォルトの名無しさん2011/04/12(火) 15:34:27.06
初心者だけど1.9から始めてよかったと思う
言われてるほど難しいものってないよ
0853デフォルトの名無しさん2011/04/12(火) 16:42:36.53
難しいっていうかめんどくさいんだよ
文字エンコーディング関連

何も考えずにエラー出さないで一発で書けたことないぞ
0854デフォルトの名無しさん2011/04/12(火) 16:47:32.64
>>852
それ言ってたの書き込み数は多かったけど一人だけだから
0855デフォルトの名無しさん2011/04/12(火) 18:10:41.50
今から使うんだったら1.8使う理由ないだろ
0856デフォルトの名無しさん2011/04/12(火) 18:30:51.72
require "〜"
「〜」の部分の読み込む標準ライブラリ名の一覧ってマニュアルのどのページをみたらよいのでしょうか?
例えばrequire "kconv"のkconv
■ このスレッドは過去ログ倉庫に格納されています