Ruby 初心者スレッド Part 41
■ このスレッドは過去ログ倉庫に格納されています
0001京 ◆SsSSsSsSSs
2011/02/10(木) 13:47:51★注意★ 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を読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0792デフォルトの名無しさん
2011/04/09(土) 22:26:44.550793デフォルトの名無しさん
2011/04/09(土) 23:40:49.80お帰りください
0794デフォルトの名無しさん
2011/04/10(日) 06:42:01.76ってかこれこれ誰が考えたんだよ。
C言語作った奴か?
0795デフォルトの名無しさん
2011/04/10(日) 07:02:40.24現在のRubyのようにイテレータがきちんと枚挙をサポートしてれば出番は確実に減る
0796デフォルトの名無しさん
2011/04/10(日) 07:36:51.420797デフォルトの名無しさん
2011/04/10(日) 08:39:36.13と思って作られたもの。
0798デフォルトの名無しさん
2011/04/10(日) 09:03:51.43http://cm.bell-labs.com/cm/cs/who/dmr/kbman.html
0799デフォルトの名無しさん
2011/04/10(日) 09:15:30.57> 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.160801デフォルトの名無しさん
2011/04/10(日) 10:49:37.97def 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まず、private について。
privateは、引数なしで呼ばれた場合は、その後のメソッドが全てprivateになる。
引数をつけて呼ばれた場合は、引数のメソッドをprivateにする。
なので、その例ではどちらでもbをprivateにできる。
んで、private_class_method だけは意味が違う。
それは通常のメソッドではなく
クラスメソッド(Testから作ったオブジェクトではなく「Test自体」が持つメソッド)をprivateにするもの。
0803デフォルトの名無しさん
2011/04/10(日) 11:04:59.76class Foo
def self.bar
という記述は、さっき上に書いたように
「Fooから作ったオブジェクト」ではなく「Foo自体」のメソッドを定義する書き方。
だからprivateにするのに、private_class_methodを使っている。
0804デフォルトの名無しさん
2011/04/10(日) 12:13:49.92しらんかた
0805デフォルトの名無しさん
2011/04/10(日) 12:37:14.780806デフォルトの名無しさん
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>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<?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.980811デフォルトの名無しさん
2011/04/10(日) 16:14:58.46Rubyって簡単にxmlの操作ができますね
これで更新は出来たのですが、PHPののDOM関数のように書き換えと同時にxmlに書き込んでるわけではないのですね
データの追加・更新をしたら
fp = open(ファイル名, "w")
fp.print xml
fp.close
って書き込まないとダメってことでしょうか?
0812デフォルトの名無しさん
2011/04/10(日) 16:26:36.17いじりおわったらファイルに自分で書き出す
0813デフォルトの名無しさん
2011/04/10(日) 16:30:07.50ありがとうございます
0814デフォルトの名無しさん
2011/04/10(日) 20:19:27.43抜き取った文字列を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.36hash = {:a => 1 ,:b => 1 ,:c => 2}
p hash.index(1) #=> :a
:aと:bが配列になって返ってきてくれると嬉しかったのですが、いずれか一つしか返ってこないようです
全て返ってくるメソッドってないでしょうか?
0816デフォルトの名無しさん
2011/04/10(日) 23:23:58.750817デフォルトの名無しさん
2011/04/10(日) 23:27:39.18でもいいんじゃない
0818デフォルトの名無しさん
2011/04/10(日) 23:30:25.06Ruby/tkが入っていませんでした
gemでtkを入れたいのですがパッケージ名は何になりますでしょうか?
gem tkでは入れられませんでした
0819デフォルトの名無しさん
2011/04/11(月) 01:20:23.64そりゃそうだろうな、入ってるはずはない
オフィシャルにいくとインストーラーがあるのでそれ使わせてもらえ
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.35selectとdetectとcollectとrejectとinjectは紛らわしいから使用禁止じゃムキー
0822デフォルトの名無しさん
2011/04/11(月) 01:57:53.45関数型言語みたいにfoldlでもいいような気もするけど、
あえて挿し込むというイメージを持たせた辺りはRubyらしい
0823デフォルトの名無しさん
2011/04/11(月) 02:10:20.470824822
2011/04/11(月) 03:20:13.240825デフォルトの名無しさん
2011/04/11(月) 08:21:54.09他は無理だな
0826デフォルトの名無しさん
2011/04/11(月) 11:30:40.41という書き方あるな。でも欲しい条件が真じゃなくて、
要らない条件を書くからパッと見分かりづらいな駄目だこりゃ
rejectだけEnumerableじゃなくてHashクラスにあるからハッシュ返すのね
0827デフォルトの名無しさん
2011/04/11(月) 12:26:08.18libxmlに乗り換えるべきでしょうか?
0828デフォルトの名無しさん
2011/04/11(月) 12:28:30.24<?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.73Formattersのほう使わせて頂きます
ありがとうございます
0831デフォルトの名無しさん
2011/04/11(月) 14:14:56.83require "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.22require "./class1.rb"
としたら読み込めました
何故require "./class1.rb"じゃないと読み込めないのでしょうか?
何故require "class1.rb"とrequire "./class1.rb"は同じフォルダのクラスを指してないのですか?
0833デフォルトの名無しさん
2011/04/11(月) 14:22:52.820834デフォルトの名無しさん
2011/04/11(月) 14:29:58.230835デフォルトの名無しさん
2011/04/11(月) 14:41:53.59実害は少ないとは思うのだが
>>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.11case line
when 1
puts "1"
when 2
puts "2"
else
puts "none"
end
1と2を入力してもnoneが表示されます
どこか間違えてるのかアドバイスお願いします
0837デフォルトの名無しさん
2011/04/11(月) 15:08:58.80あとFile.dirname(__FILE__) + "/class1.rb"と書く方法もあったので、気分に応じてプロジェクト毎に使い分けたいと思います
ありがとうございます
0838デフォルトの名無しさん
2011/04/11(月) 15:21:14.88標準入力から返ってくるものは文字列なので、 整数 1 にも整数 2 にもマッチしないので else に着く
あと標準入力は今は STDIN ではなく $stdin を使うほうがいい
0839デフォルトの名無しさん
2011/04/11(月) 15:23:03.33思ったとおりに動かない場合は
line = STDIN.gets
p line # <--
case line
とかする癖をつけるといいよ
0840デフォルトの名無しさん
2011/04/11(月) 15:27:36.34pってデバッグの役割みたいなものなんですね便利ですねこれは
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行って言うくらいだから、もちろん改行つきだ
改行が不要な場合、ふつうは 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.05Rubyのgetsは通常の行の概念に沿ってるというだけの話
0844デフォルトの名無しさん
2011/04/11(月) 17:21:16.120845デフォルトの名無しさん
2011/04/11(月) 17:48:19.750846デフォルトの名無しさん
2011/04/11(月) 18:04:50.59テキストファイルの末尾が改行で終わらない場合は?
行は普通改行を含むものとしてもメリットはないと思うけどな
含んだり含まなかったりする、としておくほうが無難
0847デフォルトの名無しさん
2011/04/11(月) 20:00:13.90f = File::open("sample.txt", "w")とf = open("sample.txt", "a")どちらで書く事が推奨されてますか?
好みの問題であればFile::は省略しようと思います
0848デフォルトの名無しさん
2011/04/11(月) 20:40:34.650849デフォルトの名無しさん
2011/04/11(月) 20:59:09.350850デフォルトの名無しさん
2011/04/12(火) 13:58:10.10どのようなキーワードで検索したらよいのでしょうか?
以前、過去スレ(過去半年分)でそういうやりかたが書いてあったのを記憶しているのですが見つかりませんでした
0851デフォルトの名無しさん
2011/04/12(火) 14:01:27.080852デフォルトの名無しさん
2011/04/12(火) 15:34:27.06言われてるほど難しいものってないよ
0853デフォルトの名無しさん
2011/04/12(火) 16:42:36.53文字エンコーディング関連
何も考えずにエラー出さないで一発で書けたことないぞ
0854デフォルトの名無しさん
2011/04/12(火) 16:47:32.64それ言ってたの書き込み数は多かったけど一人だけだから
0855デフォルトの名無しさん
2011/04/12(火) 18:10:41.500856デフォルトの名無しさん
2011/04/12(火) 18:30:51.72「〜」の部分の読み込む標準ライブラリ名の一覧ってマニュアルのどのページをみたらよいのでしょうか?
例えばrequire "kconv"のkconv
0857デフォルトの名無しさん
2011/04/12(火) 18:37:53.53このページをお探しで?
だったら、 http://doc.ruby-lang.org/ja/1.9.2/doc/index.html の
標準添付ライブラリ
・All libraries
ってところ。
0858デフォルトの名無しさん
2011/04/12(火) 18:49:38.56今からなら1.9でいいと思うんだけどねえ
>>853
ASCII-8BITの面倒くささ
0859デフォルトの名無しさん
2011/04/12(火) 18:55:50.57ありがとうございますっ!
0860デフォルトの名無しさん
2011/04/12(火) 19:06:06.75で、当時お勧めされてなかったというのはそれはそれで何か問題あるの?
0861デフォルトの名無しさん
2011/04/12(火) 19:53:54.10UTF-8だけ使ってると楽だよね1.9
0862デフォルトの名無しさん
2011/04/12(火) 20:20:55.55それから一気に他のライブラリも対応したし
0863デフォルトの名無しさん
2011/04/12(火) 20:43:07.90問題ないなら日本語は最初からUTF-8使おうぜムーブメントの後押しをしたのは間違いない
今のRubyはたいていUTF-8だ
0864デフォルトの名無しさん
2011/04/12(火) 20:45:16.720865デフォルトの名無しさん
2011/04/12(火) 20:47:59.270866デフォルトの名無しさん
2011/04/12(火) 21:08:36.88どっちか片方なら1.8.7でいいんじゃないのかね
前にもちらっとあったが、
このスレの想定してる初心者は文字エンコーディングに関する知識もないという仮定っぽいし
0867デフォルトの名無しさん
2011/04/12(火) 22:23:49.50全くの初めてなら、悪いこと言わんので1.8.7にしとけ
0868デフォルトの名無しさん
2011/04/12(火) 22:35:24.110869デフォルトの名無しさん
2011/04/12(火) 22:40:55.31ありがとうございます。試してみます
0870デフォルトの名無しさん
2011/04/13(水) 02:54:29.740871デフォルトの名無しさん
2011/04/13(水) 06:06:51.94個人的には初心者も含めどんどん1.9使ってもらって
本当の初心者が1.8ではなく1.9を使うとどういうところでハマるのか
情報を蓄積していったほうがいいと思う
最初から1.9を対象にした入門書(artonさんの本とか)も出てきてるし
0872デフォルトの名無しさん
2011/04/13(水) 06:25:32.82あなたたちプロの人間にはたいしたことのないものかもしれませんが、
文字列操作しないライブラリなんてないんだし、
そこの使い勝手が悪いというのは初心者の全てに影響します
初心者向け解説があるならまだしも、そんなものは現存しないようだし
0873デフォルトの名無しさん
2011/04/13(水) 06:36:40.281.8で日本語文字列の長さを得るのってどうやってやるんだっけ?
0874デフォルトの名無しさん
2011/04/13(水) 06:38:55.80初心者が飛び込んで怪我しても大丈夫な環境が用意されているかというと、かなり怪しいなw
Cと英語が読めて当たり前というのはかなり人を選ぶという自覚くらいは持って頂きたいところ
0875デフォルトの名無しさん
2011/04/13(水) 06:46:40.18英語が読めないと、エラーメッセージの意味がわからなくて致命的だからな・・・
「なんかよくわからんけど日本語処理でエラー出た」で諦めてしまう
0876デフォルトの名無しさん
2011/04/13(水) 06:50:33.56require 'kconv'
str = "日本語deアベシ".tosjis
p str.split(//s).size #=> 8
正規表現でうまく拾えない場合はアウト
0877デフォルトの名無しさん
2011/04/13(水) 06:54:18.73半角カタカナをkconvすると全角になるのでコード自体0点
0878デフォルトの名無しさん
2011/04/13(水) 06:56:43.12もしかして濁点が文字だとか思ってる韓国人?
0879デフォルトの名無しさん
2011/04/13(水) 06:57:32.22>>872に皮肉で言ったに決まってるだろ察しろよこのすかぽんたぬす
0880デフォルトの名無しさん
2011/04/13(水) 07:03:57.01jcode.rb
0881デフォルトの名無しさん
2011/04/13(水) 07:06:05.15あれ戻ってこないから嫌いなんだよね
使い終わったら jcode.rb の効果を取り除くとか、そういうことができれば使い倒したんだけど…
0882デフォルトの名無しさん
2011/04/13(水) 07:09:32.240883デフォルトの名無しさん
2011/04/13(水) 07:10:57.370884デフォルトの名無しさん
2011/04/13(水) 07:27:13.54そうでないなら "日本語でアベシ" と全角で書けばいい
リテラルでは半角カタカナだったけどメソッドチェーンで全角に即変換されて消えるんですねえ、なんてのに教育的効果はねえ
変換後も人間に読める形の(それこそ文字数同じの)リテラルで普通に書けるんだから、
だったら最初から変換後のをわかりやすく書いと毛
>>881
jperl みたいなもんだなあと思って見てた(Java Perl ではなく Japanese Perl のほう)
動作書き換えすぎて jcode がないと保守できないコードになる上に
日本語知らないライブラリでのバグも増えそうだったので、早々に使うのやめちゃったよ
0885デフォルトの名無しさん
2011/04/13(水) 08:28:55.240886デフォルトの名無しさん
2011/04/13(水) 10:39:45.05初めての言語がRuby1.9だけど別に1.9でもいいかなと思ってるよ
0887デフォルトの名無しさん
2011/04/13(水) 11:49:43.90何も知らない超初心者を想定するというのがおかしい。
0888デフォルトの名無しさん
2011/04/13(水) 12:03:27.080889デフォルトの名無しさん
2011/04/13(水) 12:09:59.500890デフォルトの名無しさん
2011/04/13(水) 12:20:39.280891デフォルトの名無しさん
2011/04/13(水) 21:43:01.900892デフォルトの名無しさん
2011/04/13(水) 21:51:21.97{
ここに不特定の文字列が何十行にも入ります
}
ファイルの最後には必ず}の文字列があります(前後にタブや改行を含む場合あり)
ファイルの最後の}を見つけて、}の前に特定の文字列を追加したいのですが
ファイルの最後の}を見つけて}を「特定の文字+}として置換したらいいのかなと考えてます。
このファイルの最後の}の見つけ方はどうやって見つけたらよいでしょうか?
}はファイルの最後だけでなく、ファイルの途中に何度も出てきます
■ このスレッドは過去ログ倉庫に格納されています