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

Ruby 初心者スレッド Part 18

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

   【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
   【最新安定版の Ruby1.8.6 の使用を強くお勧めします】

関連スレやURLは>>2-8あたりを見てください。Ruby on Railsの質問は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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0002デフォルトの名無しさん2008/02/22(金) 14:36:38
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がおすすめでしょうか?

A:
プログラム作成の初心者だったら
「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
http://www.amazon.co.jp/dp/4797336617/
他の言語経験があるんだったら
「プログラミングRuby 第2版 言語編」
http://www.amazon.co.jp/dp/4274066428/
0003デフォルトの名無しさん2008/02/22(金) 14:39:10
■前スレ
Ruby 初心者スレッド Part 17
http://pc11.2ch.net/test/read.cgi/tech/1200472887/

■関連スレ
Rubyについて Part 30
http://pc11.2ch.net/test/read.cgi/tech/1200106073/

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

【ActiveScript】RubyをWindowsで使うスレ【GUI】
http://pc11.2ch.net/test/read.cgi/tech/1155031689/

Ruby on Rails
http://pc11.2ch.net/test/read.cgi/tech/1191381506/

Rubyについて(アンチ専用) Part002
http://pc11.2ch.net/test/read.cgi/tech/1200210768/
0004デフォルトの名無しさん2008/02/22(金) 14:40:19
■公式/非公式関連リンク
Ruby Home Page
http://www.ruby-lang.org/ja/

Rubyリファレンス(よくサーバーエラーになります)
http://www.ruby-lang.org/ja/man/
http://www.ruby-doc.org/ (英語)

リファレンスのHTMLヘルプ版配布
http://elbereth-hp.hp.infoseek.co.jp/ruby.html
# Windowsで便利

Ruby 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/
# 好評書籍をWebで公開中、ただし英語

逆引きRuby
http://www.namaraii.com/rubytips/
0005デフォルトの名無しさん2008/02/22(金) 14:41:17
RAA - Ruby Application Archive
http://raa.ruby-lang.org/

RubyForge
http://www.rubyforge.org/
# Rubyのアプリやライブラリが検索できる

日本Rubyの会 公式Wiki
http://jp.rubyist.net/
# メニューに表示されていない埋もれた情報ページ多数

Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/
# コードレビューが好評

Ruby hotlinks 五月雨版(日記や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/

Matzにっき(Ruby作者の日記)
http://www.rubyist.net/~matz/
0006デフォルトの名無しさん2008/02/22(金) 14:42:08
■最近できたWiki
Ruby 初心者スレッド Hiki
http://starlet.s145.xrea.com/ruby/hiki/

Ruby Portal
http://ruby.morphball.net/portal/
0007デフォルトの名無しさん2008/02/22(金) 14:51:23

テンプレ終わり
0008デフォルトの名無しさん2008/02/22(金) 15:04:01
   _,,....,,_  _人人人人人人人人人人人人人人人_
-''":::::::::::::`''> ゆっくりした結果がこれかよ!!   <
ヽ::::::::::::::::::::: ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
 |::::::;ノ´ ̄\:::::::::::\_,. -‐ァ
 |::::ノ   ヽ、ヽr-r'"´  (.__
_,.!イ_  _,.ヘーァ'二ハ二ヽ、へ,_7、
::::::rー''7コ-‐'"´    ;  ', `ヽ/`7
r-'ァ'"´/  /! ハ  ハ  !  iヾ_ノ
!イ´ ,' | /__,.!/ V 、!__ハ  ,' ,ゝ
`!  !/レi' (ヒ_]     ヒ_ン レ'i ノ
,'  ノ   !'"    ___   "' i .レ'
 (  ,ハ    /_ /   人!
,.ヘ,)、  )>,、 _____, ,.イ ハ
0009デフォルトの名無しさん2008/02/22(金) 15:23:45
         r'ニニニ二二二ニニニ、ヽ
         | |     .@     | |            ト、____, へ
      rー┤|           |├、          ヽ         }
      |   | |       Π    | | |        ≡三ーーーーァ   /
      l    l l     lニ  コ  .| | |         ≡    /  /
     |    l l      |_|    | | |        ≡三   ./  /
       l__l_l______|_|__|   っ     .≡ /  /
       | /  ,イ,へ 丶、       ヘ       ≡三./  /       ノ|
       | ,' / //  \| \ ト、 ヽ ',   つ  ≡{   丶ーーーー'  }
      !j./l /        ` ヽト、ヽ }         ゝ、_______丿
.     | | .!/.!  ○    ○ l l |ヽ,'    ⊃
       l | | .l/////////////! | !.|      
       .| ! | ト、  ,-ー¬   .ィ| .| l     こ、これは>>1乙じゃなくてバギクロスなんだから
        | l ! l l` r --.' <j ,' | |    変な勘違いしないでよね!
        | .l ', l |ャ-ミ≡彳ァトイ ,'! !   
      .| | ヽ| | l r´ )/ハy / | ',
0010デフォルトの名無しさん2008/02/22(金) 15:29:55
    < ̄ ̄ ̄>
       ̄>/
     / /
    /  <___/|
    |______/
        |
     /  ̄  ̄ \
   / ノ   \ \
  /  <●>::::::<●>  \  こ、これは乙じゃなくてエナジーボンボンなんだから
  | /// (__人__) /// |  変な勘違いしないでよね!
  \    ` ⌒´    /
  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ \
0011デフォルトの名無しさん2008/02/22(金) 15:40:31
AA厨うぜえ
0012デフォルトの名無しさん2008/02/22(金) 17:48:57
ifの条件をorで繋げて書いているのですが凄く長くなってしまいます、
途中で改行したいのですがどうしたらいいでしょうか?
0013デフォルトの名無しさん2008/02/22(金) 18:10:07
orが行末にくるように改行を入れる。

見やすさのためにthenを省略しないようにするといいかも。
0014デフォルトの名無しさん2008/02/22(金) 18:43:09
Rubyスクリプティングテクニック
― テスト駆動による日常業務処理術
http://www.oreilly.co.jp/books/9784873113562/

これいい本ですか?
0015デフォルトの名無しさん2008/02/22(金) 22:53:02
>>13
ありがとうございます _ _綺麗になりました。

立て続けに質問すみません。
Ruby/Tkで部品(ラベル)を作成しその中のテキストを処理中に複数回変更したのですが、
即時に変更されず、一番最後の変更のみが反映されます。
バッファリングがなされているのかと思い、STDOUT.flashを間に挟んでみたのですが、うまくいきませんでした。
ご助言頂けると嬉しいです _ _
0016デフォルトの名無しさん2008/02/22(金) 23:12:59
>>15
Thread.start{処理}
ってして見るのはどうか。
0017デフォルトの名無しさん2008/02/23(土) 10:48:38
matlabから乗り換える言語の候補でrubyを考えてるのですが
行列計算やグラフのplotはRと連携するのでしょうか?
Rとの連携ってどこまでできるのでしょうか?
0018デフォルトの名無しさん2008/02/23(土) 12:28:44
>>17
うむ、Rでできることのほとんどについて、ロクにサポートできないといっていい

というか、matlabから移行する先としては不適当だろ
Rubyは単なる汎用なオブジェクト指向スクリプト言語に過ぎない
0019デフォルトの名無しさん2008/02/23(土) 13:04:05
matlabとは性質が全然違うと思う
octaveなら分かるがw
0020デフォルトの名無しさん2008/02/23(土) 14:03:52
組込クラスや標準ライブラリに木構造を扱うクラスが無いのはなぜでしょうか
0021デフォルトの名無しさん2008/02/23(土) 15:00:05
ネタにマジレス(ry
0022デフォルトの名無しさん2008/02/23(土) 15:02:57
>>17
Python で numpy 使うといいよ
0023デフォルトの名無しさん2008/02/23(土) 16:12:50
>>17
RSRuby
ttp://web.kuicr.kyoto-u.ac.jp/~alexg/rsruby/
0024デフォルトの名無しさん2008/02/23(土) 16:40:25
rushってどうよ?あなたのはづかしい体験談プリーズ
http://journal.mycom.co.jp/news/2008/02/22/042/index.html
0025デフォルトの名無しさん2008/02/23(土) 20:00:55
Rushはプログレハード
0026デフォルトの名無しさん2008/02/23(土) 21:37:26
RubyでJAVACCみたいなパーサ生成
モジュールってありますか?

AST扱える奴がいいのでつが
0027デフォルトの名無しさん2008/02/23(土) 23:21:42
今だと treetop とか。
0028デフォルトの名無しさん2008/02/24(日) 12:01:00
>>26
Racc
Lex なら StringScanner または Ragel
0029デフォルトの名無しさん2008/02/24(日) 12:31:43
>>28
フォロー。
Raccはyaccみたいなパーサジェネレータだから、ASTは自分で組む必要がある。
0030デフォルトの名無しさん2008/02/24(日) 12:47:04
メール送信をしようと思って、
gemsを見たらメール関連のパッケージがたくさんあります
現在一番使われてるパッケージってどれですか?
0031デフォルトの名無しさん2008/02/24(日) 13:19:48
…TMailかな

Rubyだけでもなんとかなると思うけれど

require 'nkf'
mail=<<EOM
From: #{@sender} <#{@from}>
To: <#{@to}>
MIME-Version: 1.0
Subject: #{NKF.nkf('-jM',@subject.tojis)}
Date: #{@now.rfc2822}
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

#{NKF.nkf('-Ej',@body)}
EOM

Net::SMTP.start(@smtp_server,25,@helo_domain){|smtp|
smtp.send_mail(mail, @from, @to)
}
0032デフォルトの名無しさん2008/02/24(日) 13:53:43
テストツールの利用の仕方がよくわかりません
0033デフォルトの名無しさん2008/02/24(日) 14:08:46
>>32
テストの知識がないとだめだよ
ソフトウェアテストをRubyでも行うというツールであって、ソフトウェアテストをRubyでも学べるというツールじゃない

タイミング的に
Rubyスクリプティングテクニック ― テスト駆動による日常業務処理術
ttp://www.oreilly.co.jp/books/9784873113562/
これを持ち出して「ただの初心者本であってテスト駆動云々については書いてないじゃん!」とかDisるのがよいぞ

「Rubyで学ぶテスト入門」とかいうのは需要はあると思うんだけどねえ
0034デフォルトの名無しさん2008/02/24(日) 14:17:54
メソッド間の値の受け渡しのとこにてきとーな値と正しい答えのペアを持ってきて
メソッドが正しく動作するか検証するツールだろ
0035デフォルトの名無しさん2008/02/24(日) 14:20:44
>>33
Rubyを256倍使うための本 極道編
というのがあるこたあるが、2001年というのはこの世界だと古文書だな。
0036デフォルトの名無しさん2008/02/24(日) 16:39:43
>>32
「Ruby Test::Unit」または「RSpec」でぐぐれ
0037デフォルトの名無しさん2008/02/24(日) 16:40:08
>>29
>Raccはyaccみたいなパーサジェネレータだから、ASTは自分で組む必要がある。
kwsk
0038デフォルトの名無しさん2008/02/24(日) 16:50:50
>>36
そういう話ではないと思われ
0039デフォルトの名無しさん2008/02/24(日) 17:19:48
>>33
「disる」とかいうのやめ
0040デフォルトの名無しさん2008/02/24(日) 21:48:25
>>37
BNFとか書けばASTを完璧に組み上げる
パーサを生成してくれるわけじゃないという意味。
(というかそこまで出来たらコンパイラコンパイラ名乗って
いい気がする)

構文解析である文法規則に還元されたときの
処理は自分で書かないといけない。
0041デフォルトの名無しさん2008/02/24(日) 23:11:50
>>40
それは Racc の説明であって JavaCC ではないという理解で OK?
もしそうなら、JavaCC はASTを自動で作ってくれるの?
0042402008/02/25(月) 00:53:05
ぉk。

JavaCCのことはさっぱり。
ただ>>26の要求にRaccは微妙かなと思って。
0043デフォルトの名無しさん2008/02/25(月) 06:21:28
class Foo
 class <<self
 end
end

これの2行目の意味が良く分からないんですが・・・
0044デフォルトの名無しさん2008/02/25(月) 06:32:09
>>43
特異クラスの定義
Railsで時々見るな
ttp://www.ruby-lang.org/ja/man/html/FAQ_A5AFA5E9A5B9A1A2A5E2A5B8A5E5A1BCA5EB.html#a6.2e6.20.c6.c3.b0.db.a5.af.a5.e9.a5.b9.a4.c8.a4.cf.b2.bf.a4.c7.a4.b9.a4.ab
0045デフォルトの名無しさん2008/02/25(月) 10:51:44
すいません、クイッククエスチョン。

特異メソッドは特異クラスのサブクラスに継承されるけど
クラスインスタンス変数は継承されないよね?あってる?
0046デフォルトの名無しさん2008/02/25(月) 11:27:47
rhtmlファイルでシンタックスエラーがあるみたいなんですが、どこがエラーか分かりません。
調べる方法があればおしえてください。
0047デフォルトの名無しさん2008/02/25(月) 11:52:29
ppよりもっとディープなインスペクション(そのインスタンスの
メソッドやプロパティーのリストまで表示したり)をするには
どうしたらいいですか?
0048デフォルトの名無しさん2008/02/25(月) 11:52:45
>>45
そんな感じだったような気がする

>>46
静的なファイルなのなら、コマンドラインからerbやerubyコマンドに渡せばいい
スクリプトで動的に生成されたものにエラーがあるという話なのならちょっと違う

~$ cat test.rhtml
<title>てすと</title>
<h1>Hello, <%= World %>.</h1>

~$ erb test.rhtml
(erb):2: uninitialized constant World (NameError)
~$ cat test.rhtml
<title>てすと</title>
<h1>Hello, <%= "World" %>.</h1>

~$ erb test.rhtml
<title>てすと</title>
<h1>Hello, World.</h1>
0049デフォルトの名無しさん2008/02/25(月) 12:06:33
>>47
よーわからんがここ読め
ttp://www.ruby-lang.org/ja/man/html/Module.html

irb> 'str'.class.instance_methods
["send", "between?", "%", "rindex", "reject", "[]=", "split", "<<",
"object_id", "strip", "size", "singleton_methods", "downcase", "gsub!",
"count", "succ!", "__send__", "downcase!", "intern", "member?", "squeeze!",
...
irb> require 'net/http'
irb> Net::HTTP.instance_variables
["@proxy_port", "@proxy_addr", "@proxy_pass", "@is_proxy_class", "@proxy_user"]
0050デフォルトの名無しさん2008/02/25(月) 18:59:27
#:nodoc: とか #.nodoc: ってなに?
0051デフォルトの名無しさん2008/02/25(月) 19:31:31
ドキュメントなんか書くものか!というRubyistの強い意志
0052デフォルトの名無しさん2008/02/25(月) 22:34:11
>>46
erb -x test.rhtml | ruby -wc
または
erubis -z test.rhtml
つーかここよめ
ttp://d.hatena.ne.jp/kwatch/20080222/1203680051

>>48
それはtest.rhtmlを実行しているだけなので、シンタックスエラーのチェックには向かない。
0053デフォルトの名無しさん2008/02/26(火) 01:42:14
ハッシュを使い回すのではなく、俺用データのクラスを作ろうと思いました
def initialize の中で、インスタンス変数を
@hoge=nil
@hage=nil
@fuga=nil
...
と15個くらい書いてるんだけど、initializeの時点でnil入れておくって無意味だよね?
0054デフォルトの名無しさん2008/02/26(火) 02:22:09
@hogeの使途が分からない俺たちにとってnilを入れておく事に意味が有るか無いかは判断できない

@ary = []
@ary.each{|e| p e}
ってやれば何も出力されないけど

@ary = nil
@ary.each{|e| p e}
ってやるとnilでっせって怒られる

いきなり
@ary.each{|e| p e}
ってやると@aryなんて知りまへんでって怒られる

俺は1番目を良く使うけどね
0055デフォルトの名無しさん2008/02/26(火) 02:39:29
>>54
自分でそのコード実行してみた?
0056デフォルトの名無しさん2008/02/26(火) 02:42:47
irb(main):001:0> nil.each{|e| p e}
NoMethodError: undefined method `each' for nil:NilClass
from (irb):1
from :0
irb(main):002:0> @hoge.each{|e| p e}
NoMethodError: undefined method `each' for nil:NilClass
from (irb):2
from :0
irb(main):003:0> @hoge = []
=> []
irb(main):004:0> @hoge.each{|e| p e}
=> []
0057デフォルトの名無しさん2008/02/26(火) 02:51:17
>>54
>いきなり
>@ary.each{|e| p e}
>ってやると@aryなんて知りまへんでって怒られる
インスタンス変数でなくローカル変数の場合はその通りなのだが
未初期化のインスタンス変数を参照した場合は nil となるはず

>>53
上記のことを踏まえての質問ということでおk?
やってもやらなくてもnilが入っているという意味ではその通りかも知れないが
クラスで用いるインスタンス変数を明示的に示しておくという意味では無意味ではないと思う
0058デフォルトの名無しさん2008/02/26(火) 02:53:56
>>55
インスタンス変数は「定義」しなくてもnilだってのは忘れられがちだよな

インスタンス変数の「定義」をinitializeでする意味はRuby的にはあまりないと思う
0059デフォルトの名無しさん2008/02/26(火) 02:59:02
厳密にはメソッドが追加されるからただの定義ではないけど attr_reader とか
0060デフォルトの名無しさん2008/02/26(火) 02:59:28
外部からアクセスされるなら直後のattrに名前が出るし
外部からアクセスされないインスタンス変数って一体

あ、サブクラスからアクセスしたいか
0061デフォルトの名無しさん2008/02/26(火) 03:23:53
>>60
外部からアクセスされないインスタンス変数はあっても全然おかしくないと思う
むしろすべての実装を外部からアクセスできるように公開する方がまずいのでは
0062デフォルトの名無しさん2008/02/26(火) 03:28:17
インスタンス変数は外部からアクセスしたいときにのみおもむろに使え、ということなのでは
それ以外ではメソッド引数とかで細々とやれと
0063デフォルトの名無しさん2008/02/26(火) 03:42:22
Rubyのスコープはちょっといろんな言語と違うからね

a = 100
def foo()
return 1 + a
end
foo()
とすると何がかえってくると思う?aが定義してないってエラーになるんだぜ
0064デフォルトの名無しさん2008/02/26(火) 03:43:47
こういうときはaを@aに変えるのが定石
0065デフォルトの名無しさん2008/02/26(火) 04:08:26
>>63
そもそもの問題として、メソッド定義の中以外にローカル変数なんて置くなよ…
0066デフォルトの名無しさん2008/02/26(火) 04:16:55
トップレベルに定義したメソッドなんだろ

トップレベルのローカル変数は特別扱いしてくれてもいいような気もするけどな
0067デフォルトの名無しさん2008/02/26(火) 06:06:31
でもnilの特別扱いは要らない…
0068デフォルトの名無しさん2008/02/26(火) 06:25:56
irb(main):001:0> a=[0,1,2]
=> [0, 1, 2]
irb(main):002:0> [a]
=> [[0, 1, 2]]
irb(main):003:0> [*a]
=> [0, 1, 2]
irb(main):004:0> [3,4,5,*a]
=> [3, 4, 5, 0, 1, 2]
irb(main):005:0> [*a,3,4,5]
SyntaxError: compile error
(irb):5: syntax error, unexpected ',', expecting ']'
[*a,3,4,5]
^
from (irb):5

4行目は良いのに5行目はダメっていう挙動が理解できないんだが・・・
0069デフォルトの名無しさん2008/02/26(火) 06:59:48
>>68
*arrの「うしろ」に置けないだけ
先頭に書けないんじゃなくて、展開後にも何かがあると文法エラー

irb> a = [1, 2, 3]
[1, 2, 3]
irb> [9, 8, *a, 7]
SyntaxError: compile error
0070デフォルトの名無しさん2008/02/26(火) 07:01:21
ていうか、もしかして *array を「arrayの要素をバラす表現」とかいう理解をしてる?
0071デフォルトの名無しさん2008/02/26(火) 07:06:23
1.9なら通るよ
0072デフォルトの名無しさん2008/02/26(火) 13:04:14
自作プログラムをクラスごとにファイルに分けると20ファイルくらいになる
「ああ、実行するたびに20回もHDDにアクセスしてるんだ」と考えると憂鬱になる

ということで開発用ディレクトリと実行用ディレクトリを分けた
実行用ディレクトリには開発用ディレクトリにあるスクリプトを連結したものを入れてる
これならファイルアクセスの回数は数回で済む

いや標準添付のクラスとかrequireしてる時点で何個もファイル読み込みまくってるのはわかってんだけど
0073デフォルトの名無しさん2008/02/26(火) 21:55:41
>>72
その最適化で何秒早くなったの?
0074デフォルトの名無しさん2008/02/26(火) 21:57:22
時間が問題だと思ってる?
0075デフォルトの名無しさん2008/02/26(火) 22:17:03
>>74
>>72はそういうことを言いたいわけではないと思われ
0076752008/02/26(火) 22:17:55
>>72じゃなくて>>73だorz
0077デフォルトの名無しさん2008/02/26(火) 22:30:19
>>72は一言も最適化とは言ってないな。
0078デフォルトの名無しさん2008/02/26(火) 23:34:14
ディスクアクセスが無意味に多いのが心情的に嫌なのだろう
そう感じるセンスそのものは悪くはない
0079デフォルトの名無しさん2008/02/27(水) 01:28:06
無意味に多いのかそれは、とか
全部動かさずにユニットテストしろよ、とか
0080デフォルトの名無しさん2008/02/27(水) 01:49:05
要するにプリコンパイルヘッダーが必要ということか?
0081デフォルトの名無しさん2008/02/27(水) 04:45:24
C++ とかやると、コンパイル時にいくつヘッダ読んでるかなんて
全く気にならなくなるZE
0082デフォルトの名無しさん2008/02/27(水) 11:05:29
コンパイル時(>>72の例だと開発中)はどうでもいいんだが、実行時に、というのが心情的に気持ち悪いという話だろう。
0083デフォルトの名無しさん2008/02/27(水) 11:26:02
なら、コンパイル系の言語を使えばいいんじゃまいか?
0084デフォルトの名無しさん2008/02/27(水) 11:54:36
そんな読み込み程度を気にするのがいかにも初心者だな
0085デフォルトの名無しさん2008/02/27(水) 11:55:55
Ruby使いはお茶でも飲んでまたーりするがよい
わっはっはっは
0086デフォルトの名無しさん2008/02/27(水) 12:06:07
>>84
そうか?
「それ自身は事実だから好きにせえ」以外の必死な否定論が出ることのほうがよっぽど初心者だと思うが…
0087デフォルトの名無しさん2008/02/27(水) 12:07:32
ところでCが書けないRuby書きはニワカだと思いますがどうですか。
0088デフォルトの名無しさん2008/02/27(水) 12:13:07
I/O を工夫することはパフォーマンスチューニングでは基本事項。
もとの環境や条件が不明だけど、CGIのようにリクエストのたびにプロセスを
実行しなきゃいけない場合は、読み込み速度を工夫するのは別におかしな話ではない。
ファイルサイズが小さくても、ファイルの数が多ければハードディスクのシークタイムは
バカにならない。
ただ、ファイルを連結しても断片化してたら効果は少ないから、デフラグを
ちゃんとやってやる必要があるけど。
0089デフォルトの名無しさん2008/02/27(水) 12:17:28
もうそんな時代でもないんだけどな
0090デフォルトの名無しさん2008/02/27(水) 12:24:31
>>89
ストレージへのアクセスが問題にならないコンピュータができたならぜひ教えてくれ

というか最近の子は「HDDがガリガリ言う」とか気にしないもんかね
静音化されて意識しなくなったんだろうか
0091デフォルトの名無しさん2008/02/27(水) 12:29:29
HDDはアクセスすると壊れるからなあ
いや、こんなんで壊れる確率がはっきり増えるHDDってのもかなりアレだが…

とりあえず
「クラス単位の細切れファイルをインストール時に数個にまとめとく」
というのは別に非難されるようなことじゃないと思うぞ
というかそんなにまでして行為そのものを否定する理由を知りたい
0092デフォルトの名無しさん2008/02/27(水) 12:30:48
ガリガリ言うほどのアクセスを問題にしてるのか?
そもそもそんなこと言ってたらRubyなんて選択肢にならんだろ
0093デフォルトの名無しさん2008/02/27(水) 12:32:34
鈍足のRubyを使う人は達観した境地にあるので小さいことは気にしない
0094デフォルトの名無しさん2008/02/27(水) 12:57:19
正直、完全に論点がずれてるような気がしてならない。
元発言は、無駄を嫌うというプログラマの美徳を発揮してるだけじゃないの?
0095デフォルトの名無しさん2008/02/27(水) 13:04:35
チューンナップを突き詰めるとRuby使うなになるからおすすめしない
0096デフォルトの名無しさん2008/02/27(水) 13:08:02
Railsみたいな糞のかたまりで遊ぶのがRubyistだからな
0097デフォルトの名無しさん2008/02/27(水) 13:16:36
Railsのナカミを喜んでる人は少数だと思う

Railsは開けないほうがよい箱だ
あくまで外部から自分のために便利に使うシステム
0098デフォルトの名無しさん2008/02/27(水) 14:42:30
これが SyntaxError になるんだけど何故でしょうか?

def foo?; end
def bar?; end

case
when not foo?
when not bar?
end
0099デフォルトの名無しさん2008/02/27(水) 14:52:00
>>94
まぁ、美意識の問題だわな。
そしてそれは、そんな変なエネルギーってわけではない。
0100デフォルトの名無しさん2008/02/27(水) 15:15:48
>>98
notだから。

case
when (not foo?)
when (not bar?)
end

か

case
when ! foo?
when ! bar?
end

なら期待通りに動く
0101デフォルトの名無しさん2008/02/27(水) 15:16:13
>>98
この辺の話かな
ttp://www.ruby-lang.org/ja/man/html/trap_A4C7B2F2B7E8A4B9A4EBA4E2A4CE.html

when (not foo?)
ならおkのはず
0102デフォルトの名無しさん2008/02/27(水) 18:42:53
[標準出力へのフックを仕込む]
標準出力に出力
標準出力に出力
標準出力に出力
[標準出力に書き出した内容をメールで送信]
ってやりたいんですが、
どうやったら出来ますか?
0103デフォルトの名無しさん2008/02/27(水) 18:55:07
出力時にスコープの広い変数に文字列を追加保存しとけばいいじゃん?
0104982008/02/27(水) 19:02:54
>>100, >>101
なるほど。
てっきり「not foo?」は「式」かと思っていたんですが、「文」なんですね。
了解しました。深いっす。
0105デフォルトの名無しさん2008/02/27(水) 19:12:13
phpでいうis_array()はどうやればいいですか?
rubyは配列もあるしハッシュもあるし、自分でコレクションも作れるしで
どう判定していいのか分かりません(?o?)
0106デフォルトの名無しさん2008/02/27(水) 19:17:02
[0,1,2].is_a?(Array) #=> true
[0,1,2].kind_of?(Array) #=> true

ArrayクラスはObjectクラスを継承している。
だからArrayクラスはObjectクラスのクラスメソッドやインスタンスメソッドも使える。
Objectクラスのリファレンスをみるべし。
http://www.ruby-lang.org/ja/man/html/Object.html
0107デフォルトの名無しさん2008/02/27(水) 19:30:43
>>106
ありがとうございます
試してみたところ、PHPとは異なり、
ハッシュと配列は明確に区別されているようですね
ハッシュ.is_a Array → false
配列.is_a Hash → false
0108デフォルトの名無しさん2008/02/27(水) 19:34:50
オブジェクト、実際的には変数、が配列かどうかを調べなければならないコードというのはRubyではかなり異常
極力他のアプローチを取るようにしたほうがいい
0109デフォルトの名無しさん2008/02/27(水) 19:40:03
case arg
when Array
when Hash
とかよくやるじゃん
0110デフォルトの名無しさん2008/02/27(水) 19:42:06
そうですか(><)
YAMLで書いた設定ファイルを読んで
該当キーをeachで回すようにしてるんですが、
キーを省略した時にはnilになりますよね。
nilをeachしたらエラーになるので、eachできるかどうかを調べてから
eachしたいのですが、
こういう場合はruby的にはどう書くものですか?
0111デフォルトの名無しさん2008/02/27(水) 19:45:14
>>110

・ 変数がnilかどうかを事前にif文で比較して弾く
・ eachでnilが例外エラーを起こしたらその例外をキャッチする

どっちか好きなほう使え
0112デフォルトの名無しさん2008/02/27(水) 19:45:32
def hoge(foo, bar)
 raise ArgumentError unless foo.is_a?(String)
 raise ArgumentError unless foo.is_a?(Array)
 ・
 ・
 ・
end
とかメソッドの最初でモリモリやっちゃうのはだめ?
0113デフォルトの名無しさん2008/02/27(水) 19:58:48
>>112
わりと下品。

まあ、それ以上でもそれ以下でもない程度かと。
コレを無くすために悩む時間がえらい長引くってんならあっても仕方ないんじゃね。おいおい考え変えていけばいいかと。
そのクラスやメソッドに本当にそんなクラスのインスタンスが指定されることがあるのか? をよく考えるといい。
標準添付で「結果の数によってStringあるいはArrayが返ります」とかいうメソッドがあるかい?

…そういえばなんか添付モジュールで複数のクラスが返ってくる可能性のあるやつあった気がするがまあいいや。

「Stringが来たときはHashに変換しよう」とかいうのも同様。Stringなんか渡してくる奴が悪い、で桶。
raaやgemで公開して育てる気マンマンでちまちまフールプルーフさいこー、という場合はあったほうがいいのかも。
0114デフォルトの名無しさん2008/02/27(水) 20:07:48
日本語がよくわからない
0115デフォルトの名無しさん2008/02/27(水) 21:35:03
>>102
require 'stringio'
# 標準出力へのフックを仕込む
$stdout = StringIO.new
# 標準出力に出力
puts '未承諾広告'
puts 'こんにちは^^)'
#
# 標準出力に書き出した内容を
$stdout.rewind
text = $stdout.read
メールで送信(text)
0116デフォルトの名無しさん2008/02/27(水) 21:42:15
>>115
ぬう、適切だが邪悪だ…
0117デフォルトの名無しさん2008/02/27(水) 21:45:13
>>110
eachに反応するときだけeachしたいなら、
respond_to? :each する。

と思ったことが私にもありました。

なんでStringがeach持ってるんだよ……(1.8での話)

0118デフォルトの名無しさん2008/02/27(水) 21:48:51
>>116
標準出力をフックしたいとか言う元の要件自体が邪悪なだけだ(w

使い方自体は巻き戻せるIOの正しい使い方
$stderrに仕込んでおくとwarnの出力をロギングできるぞ
warn使ってる人ってあんまり見ないけどな

>>117
eachの中でArrayやHashという構造べったりの処理をするからあまり意味がなかったり…
0119デフォルトの名無しさん2008/02/27(水) 21:52:27
STDOUTに元の残ってるし、
writeメソッドがないとTypeErrorだし、
邪悪っていうにはおとなしい希ガス。
バッドノウハウなのは確かだけど。
0120デフォルトの名無しさん2008/02/27(水) 23:24:04
>>118
>標準出力をフックしたいとか言う元の要件自体が邪悪なだけだ(w
そんなことないだろ
なんで邪悪なのか説明してみな
0121デフォルトの名無しさん2008/02/28(木) 09:08:29
Herokuってどうよ
0122デフォルトの名無しさん2008/02/28(木) 12:40:13
>>120
出力先が固定になってるあたりかな。
0123デフォルトの名無しさん2008/02/28(木) 13:02:13
なんでパイプしてその先でメールするんだと
駄目なんだろ。
0124デフォルトの名無しさん2008/02/28(木) 13:06:51
>>122
それだけじゃわかんね。固定してたらなぜだめなの?
0125デフォルトの名無しさん2008/02/28(木) 13:16:13
標準出力をフックしたい⇒出力先が固定
意味不明だな。
0126デフォルトの名無しさん2008/02/28(木) 13:20:35
なんかのはずみで標準出力に出るようなものも全部キャプチャしたいなら
すなおに別プロセスで読み出せ
0127デフォルトの名無しさん2008/02/28(木) 14:07:34
こんなもんでいいんじゃね

class Dummy
@@origout = $stdout

def initialize
@buf = ''
end

def write(str)
@@origout.write(str)
@buf << str
end

def flush
tmp = @buf
@buf = ''
tmp
end
end

$stdout = Dummy.new
puts "hello"
puts "world"
$stderr.puts $stdout.flush.inspect

思い切り誤爆してきた。。。
0128デフォルトの名無しさん2008/02/28(木) 15:43:56
>>126
なんで別プロセスにするのがいいの?
$stdout = StringIO .new
だとなんか問題あるの?
0129デフォルトの名無しさん2008/02/28(木) 15:47:47
>>118 バカ
>>122 バカ
>>126 バカ
0130デフォルトの名無しさん2008/02/28(木) 15:53:15
バカとしか言えない>>129はバカでよい
是正させる気も無いようだしただの害悪だな
0131デフォルトの名無しさん2008/02/28(木) 16:52:29
>>128
ttp://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFCAD1BFF4.html#a.24stdout

大抵はそれで問題ないけど
拡張ライブラリとか子プロセスなんかの出力は
$stdoutを書き換えるだけだとリダイレクトできないはず
0132デフォルトの名無しさん2008/02/28(木) 18:41:22
Rubyに限ることではありませんが、
httpでpostするデータが大きくてメモリ不足になるとき
どうやって回避するのがよいのでしょうか?
Net::HTTP.start(host) {|http| r = http.post(path, data, header) }
という感じでpostするときdataが大きすぎる場合に備えて
小出しに分けて送ることってできませんか?
0133デフォルトの名無しさん2008/02/28(木) 19:08:26
>>131
だったら最初からそう書けよ
おまえの書き方だと $stdout を変更するのがすべて悪いみたいじゃないか

>>130
バカはおまえだろ
0134デフォルトの名無しさん2008/02/28(木) 19:13:28
>>132
サーバ側の話? それともクライアント側の話?
サーバ側の話なら、cgi.rbを使わず自前でHTTPを解析する必要がある。
クライアントの話なら、dataをファイルに保存しておいて、例えば10MBずつ読み込んで送信を繰り返せばいいんじゃね?
0135デフォルトの名無しさん2008/02/28(木) 20:13:54
空気悪いな
>>131はこの話題に関しては初めて書きこんだのだが

>>132
クライアント側だとすると、body_streamを使うのはどう?
ttp://d.hatena.ne.jp/unageanu/20071009
この辺か
0136デフォルトの名無しさん2008/02/28(木) 20:34:05
>>133=129
あきらめろ、幾ら頑張ってもお前の>>129は「馬鹿じゃない」と解釈する余地が無い。
0137デフォルトの名無しさん2008/02/29(金) 01:19:04
http://www.ruby-lang.org/ja/man/html/Net_HTTPRequest.html
1.9 featureって書いてあるから1.8じゃ使えないのかと思ったら1.8.6でも使えるのね。よかった。
0138デフォルトの名無しさん2008/02/29(金) 11:22:09
>>134
クライアントです。
分けるといっても複数のpostを一連の1つのpostと
認識させるにはどうしたらいいんでしょうか…

>>135>>137
チャンク形式っていうんでしょうか?
で、body_streamを使えばヘッダとか気にしなくていい
ってことでよいでしょうか?

>>132 のdataの内容を一旦 data.txt に書き出しておいて、
あとは >>135 の例のchunkedを使うようにするとできたっぽいですが、
一時ファイルを使わないようにできないでしょうか?
0139デフォルトの名無しさん2008/02/29(金) 12:48:00
RubyにあるモジュールはCGIやHTTPの知識の必要性を良くも悪くも隠蔽しない
その知識のまま進むのは危険だ
HTTPやCGIの勉強をすることを勧めるよ
0140デフォルトの名無しさん2008/02/29(金) 13:29:26
>>138
>>137が書いてるページの body_stream 使うんだろうけど、おれもやったことないからわからん。
ぐぐったらこんなのあった
http://d.hatena.ne.jp/unageanu/20071009
0141デフォルトの名無しさん2008/02/29(金) 14:11:22
curlコマンド使うのが一番楽やねん
0142デフォルトの名無しさん2008/02/29(金) 18:17:48
「年・月・日」ではなく「年・月」の2つしかないデータがあるんだけど、
これを格納するデータオブジェクトって何がいいかな?

いや、年月日が揃ってるデータと「年・月」が同じかどうかという比較をするんよ
年月日ならDateオブジェクトなんだけど、日をどうしようかなあと
0143デフォルトの名無しさん2008/02/29(金) 18:30:19
>>142
 ・ 「どうせ参照されないからいいじゃん?」とか年金式にdayを1に固定してDateを使う
 ・ [year, month] という配列に入れておく
 ・ Dateを継承した「dayが無指定でも動く」という新しいDateを作る
0144デフォルトの名無しさん2008/02/29(金) 21:05:14
・Date に適当にメソッドを足して適当に YYYY/MM/01 でも代表元に使う
0145デフォルトの名無しさん2008/02/29(金) 21:09:37
require 'yaml'

yaml_str = <<YAML_STR
hoge:
- moge: [poge, page]
YAML_STR

data = YAML.load(yaml_str)
data['hoge'].each {|key,value| p key,value}

こうすると、
keyが{"moge"=>["poge", "page"]}
valueがnilになってしまいます。

key=moge,value=[poge, page]
になって欲しいのですが…。
どこが間違っているのでしょうか?
0146デフォルトの名無しさん2008/02/29(金) 21:47:44
data["hoge"] #=> [ {"moge"=>["poge", "page"]} ]
つまり "moge"=>["poge", "page"] という(キーが一つの)ハッシュを一つ持つ配列

mogeをリストにせずにインデントで階層にすれば
data["hoge"] #=> {"moge"=>["poge", "page"]}
になる
0147デフォルトの名無しさん2008/02/29(金) 22:09:30
>>145
data['hoge'].each {|hash| hash.each {|key,val| p key, val}}
0148デフォルトの名無しさん2008/02/29(金) 22:17:20
>>146-147
ありがとうございました
YAMLのマッピングの記述を勘違いしていたようです
0149デフォルトの名無しさん2008/03/01(土) 01:09:51
なんか最近思うんだけどさ
ここ「初心者」スレだよな・・・

素直に本家行けば?って人ばっかりじゃね?
0150デフォルトの名無しさん2008/03/01(土) 04:39:41
本スレはMatzと愉快な仲間たちについて
あれこれ語るスレであって、プログラムを語るスレではないのです


…あれ? じゃあ板違いじゃない?
0151デフォルトの名無しさん2008/03/01(土) 11:36:51
「Rubyの初心者」のスレでしょ?
プログラミング自体の初心者じゃないといけないの?
0152デフォルトの名無しさん2008/03/01(土) 11:44:14
>>149が考えるところの「本スレ」のレベルに依存するな
0153デフォルトの名無しさん2008/03/01(土) 18:15:48
>>149
同意。
0154デフォルトの名無しさん2008/03/01(土) 18:39:06
あんなS/Nの小さいスレ
使ってられねーよ
0155デフォルトの名無しさん2008/03/01(土) 20:00:41
irb> s = '2'; case s; when /(1)/,/(2)/,/(3)/ then p $1 end
"2"

irb> s = '2'; case s; when Regexp.union(/(1)/,/(2)/,/(3)/) then p $1 end
nil

なんで?
0156デフォルトの名無しさん2008/03/01(土) 20:07:39
unionすると
/(1|2|3)/ になるのではなく
/(1)|(2)|(3)/ になって、
今回マッチしたのは(2)のとこだからグループとしては$2。
$1ではない。
0157デフォルトの名無しさん2008/03/01(土) 20:16:53
>>156
をを

…正規表現をコンマで並べても用が済むcaseでunionを使うのはめんどくさいっすな
0158デフォルトの名無しさん2008/03/01(土) 21:37:16
nkf.guessやKconv.guessなんかを文字列にしたいんだけど、
この文字列の配列ってあらかじめ定義されてないんでしょうか?

文字コードの推測
http://www2u.biglobe.ne.jp/~MAS/ruby/CAB8BBFAA5B3A1BCA5C9A4CEBFE4C2AC.html
0159デフォルトの名無しさん2008/03/01(土) 21:54:35
ないっす
いわゆるエンコーディングの名称・略称を表示するようにはできてない

puts "#{str}は日本語EUCだよ!" if NKF.guess(str) == NKF::EUC

というような使い方しか想定してない模様

一応
irb> NKF.constants
["UTF8", "VERSION", "JIS", "UNKNOWN", "NKF_VERSION", "ASCII", "UTF32", "SJIS", "NOCONV", "AUTO", "REVISION", "UTF16", "EUC", "BINARY", "NKF_RELEASE_DATE"]
の結果をどうにかすればできなくはないけど、
自前で文字列対応テーブルを書いたほうがたぶん早い
0160デフォルトの名無しさん2008/03/01(土) 22:05:26
>>159
サンクス >>158のページのようなのを使いまわすことにする
0161デフォルトの名無しさん2008/03/02(日) 00:52:59
net/httpで相手サーバがタイムアウトした場合の例外をキャッチしたいんだけど、
具体的に何の例外が発生するんですか?

というか、そのへんの情報ってどっかにまとまってませんか?
0162デフォルトの名無しさん2008/03/02(日) 00:58:15
手元の俺スクリプトの例

rescue Net::ProtoRetriableError,Net::ProtoFatalError,Net::ProtoServerError,Errno::ETIMEDOUT,TimeoutError =>ex
puts 'サーバーから応答がないので空データを使います'
return ''

正直、ドレが効いてるんだかよくわからん
0163デフォルトの名無しさん2008/03/02(日) 01:04:24
net/protocol.rbを見ると、ソケット生成(接続)や読み書きは
timeoutメソッドの中でやってるのでTimeout::Errorかな。
TimeoutErrorはこれの後方互換用。

0164デフォルトの名無しさん2008/03/02(日) 01:10:11
http.getに該当する部分から飛び出す例外を全部捕捉して
「よくわからんけど鯖がエラー返しましたエラー」にすれば桶

begin
res = open(uri).read
rescue
puts "#{uri.host}のサーバかそこへのアクセスで何かエラーです"
res = ''
end

実際問題としてサーバー側の原因以外の例外はここでは起こらんわけだし
Timeoutだけ補足してもProtoServerErrorの500系エラーはスルーされるぞ
500系エラーって新幹線みたいだな
0165デフォルトの名無しさん2008/03/02(日) 01:15:10
Timeout::ErrorはStandardErrorのサブクラスではないので、
引数なしのrescueでは捕まらんのだわ。
0166デフォルトの名無しさん2008/03/02(日) 01:27:51
>>165
既にFAQレベルだな…
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/40726

直感的という言葉は使いたくないがやっぱ説明なしじゃわかりにくいよね
シグナルとかあのへんの勉強をするといいんだが、ちと重いな
0167デフォルトの名無しさん2008/03/02(日) 01:33:49
Errno::ETIMEDOUT って何?
0168デフォルトの名無しさん2008/03/02(日) 01:39:30
タイムアウトした(Timed Out)というエラー。
0169デフォルトの名無しさん2008/03/02(日) 01:46:43
ネット系はErrno::ECONNABORTEDとかErrno::ECONNRESETみたいなのも飛んでくるし、
例外をキャッチしても、それ以降の接続はなにやっても失敗したりするので悩ましい
0170デフォルトの名無しさん2008/03/02(日) 01:51:49
>>167
システムコールが返すタイムアウト

Timeout::Error → 「相手のWebサーバからHTTPの返事が返ってこない」
Errno::ETIMEOUT → 「Webサーバ以外の色々から返事が来ないタイムアウト」

と思って桶
そもそもサーバが見つからないとかそういうの。たぶん

>>169
retryはたいてい成功しないよね
0171デフォルトの名無しさん2008/03/02(日) 16:23:37

return @hoge = kekka

と

@hoge = kekka
return kekka

と

@hoge = kekka
return @hoge

ってどれが一般的かな
0172デフォルトの名無しさん2008/03/02(日) 19:11:27
@hoge = kekka
0173デフォルトの名無しさん2008/03/02(日) 20:47:42
@hoge = kekka
return
0174デフォルトの名無しさん2008/03/02(日) 21:09:01
>>171
returnを使いたくて仕方ないのなら2番目でよろしく
1番目はなんか見てて不安だ
0175デフォルトの名無しさん2008/03/02(日) 21:33:05
win環境で、一番簡単に
ファイルのオープンダイアログを表示するには
どうすればいいでしょうか

もろもろインストールの必要を最小限にしたかったりもします。
0176デフォルトの名無しさん2008/03/02(日) 22:03:12
require 'win32ole'

d = WIN32OLE.new("MSComDlg.CommonDialog")
d.maxFileSize = 256
d.showOpen
p d.fileName
0177デフォルトの名無しさん2008/03/02(日) 22:05:12
楽なのはVisualuRubyかなぁ。通常のrubyには入ってないけど、
Windows用のActiveScriptRubyならデフォで入ってます

require 'vr/vrcontrol'
fn=SWin::CommonDialog::openFilename(nil,[ ["All file","*.*"],["bmp file","*.bmp"] ])
p fn

細かいことはVisualuRubyサイトのドキュメントやサンプル見てください

ActiveScriptRuby
http://arton.hp.infoseek.co.jp/indexj.html
VisualuRuby計画(仮称)
http://www.osk.3web.ne.jp/~nyasu/software/vrproject.html
0178デフォルトの名無しさん2008/03/02(日) 22:13:20
ファイルロックに関する事なんですが、みなさんはどの様なロジックで組んでますか?
自分は普通に以下みたいな感じなんですが、ごくたまにファイルが壊れる事があるんですよね…
なにか良い方法があればご教示お願いします。

File.open('data.dat', 'r'){|file|
file.flock(File::LOCK_SH)
file.read
}

File.open('data.dat', 'w'){|file|
file.flock(File::LOCK_EX)
file.write(data)
}
0179デフォルトの名無しさん2008/03/02(日) 22:17:53
>>178
スレッド使ってる?
0180デフォルトの名無しさん2008/03/02(日) 22:22:39
>>179
いえ使ってません。
0181デフォルトの名無しさん2008/03/02(日) 22:45:34
書き込みの場合は、アンロックする前に
flushしないと、アンロックした後に書き込みが行われる場合がある
みたいな事を言っている方がいたので、その辺の問題のせいでしょうか…

File.open('data.dat', 'w'){|file|
file.flock(File::LOCK_EX)
file.write(data)
file.flush
file.flock(File::LOCK_UN)
}

とかなのかな??
0182デフォルトの名無しさん2008/03/02(日) 23:51:49
175です。早速にレス感謝です。
>>176を試みてみまして
WIN32OLERuntimeError
に悩まされております・・・

もうちょっとWIN32OLE研究してみます。
0183デフォルトの名無しさん2008/03/03(月) 00:17:15
>>176はOS側の環境依存の度合いが大きいよ
インストールしたRubyの種類に依存する>>177と好きなほう選べ
0184デフォルトの名無しさん2008/03/03(月) 00:52:19
# RDEで以下のようなスクリプトを実行します
puts '文字を打ってくれ'
s = gets
puts s + 'と打ったのだね'
#すると画面左下の実行画面が表示される部分に'文字を打ってくれ'と表示される前に
#文字を入力するように求められます(文字を打たないと'文字を打ってくれ'と出ない)

ヒントだけでいいのでご享受ください。RDEとかいう開発環境なんか捨てた方がいいのでしょうか?
0185デフォルトの名無しさん2008/03/03(月) 00:54:36
getsの前に$stdout.flushしたらうまくいったりする?

0186デフォルトの名無しさん2008/03/03(月) 00:56:47
STDOUT.sync = trueな予感
01871842008/03/03(月) 01:03:01
STDOUT.sync = true を使うことで
RDEでgetsが実行される前の文字が表示されるようになりました($stdout.flushではだめでした)
ありがとうございました! >>185 >>186
0188デフォルトの名無しさん2008/03/03(月) 06:15:51
>>182
これはどうかな?
tk環境が要るけど。

require "tk"
#rootを非表示にする
root=TkRoot.new.withdraw
types = [
["Ruby" , ".rb"],
["All Files", "*" ]
]
path = Tk::getOpenFile(:filetypes=>types, :defaultextension=>".rb")
p path
0189デフォルトの名無しさん2008/03/03(月) 13:37:22
「あまり別途インストールしたくない」という要求に対してWin32OLEやVisualuRubyが既に出てるのに
わざわざRuby/Tkで同じ標準ファイルオープンダイアログを出す根性に感服した
0190デフォルトの名無しさん2008/03/03(月) 13:43:03
宿題スレとか一部で流行ってるからな >Ruby/tk
0191デフォルトの名無しさん2008/03/03(月) 14:39:30
>>178
flock関数を使わずに、自前でロック処理を作るとか
0192デフォルトの名無しさん2008/03/03(月) 15:07:19
「自前」は迷宮への入り口の罠
何か有るはず。
俺はしらないけど^^;
0193デフォルトの名無しさん2008/03/03(月) 15:44:29
わざわざ関数って言い換えてる奴は同一人物か?

File.flockより堅固なファイルロックを自前で作れる奴なら悩んだりしないだろ
ファイルロックの失敗によってファイルが破損しているのだということを確かめる必要があると思われ
0194デフォルトの名無しさん2008/03/03(月) 17:39:45
>>187
実際の実行では不要なんだけどね
RDEの時だけ必要
0195デフォルトの名無しさん2008/03/03(月) 18:48:29
日本語にマッチする正規表現はどのように書きますか。
文字コードはUTF8またはEUC-JPです。
0196デフォルトの名無しさん2008/03/03(月) 19:56:30
それはあれだ、スクリプトがUTF-8だけどEUC-JPの日本語文字にマッチする正規表現を書きたいとかそういう引っかけ問題か(w
0197デフォルトの名無しさん2008/03/03(月) 20:23:04
Shift_JIS = /\A(?:
[\x00-\x7f\xa1-\xdf] |
[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]
)*\z/nx

EUC_JP = /\A(?:
[\x00-\x7f] |
\x8e [\xa1-\xdf] |
\x8f [\xa1-\xdf] [\xa1-\xdf] |
[\xa1-\xdf] [\xa1-\xdf]
)*\z/nx

UTF8 = /\A(?:
[\x00-\x7f] |
[\xc2-\xdf] [\x80-\xbf] |
\xe0 [\xa0-\xbf] [\x80-\xbf] |
[\xe1-\xef] [\x80-\xbf] [\x80-\xbf] |
\xf0 [\x90-\xbf] [\x80-\xbf] [\x80-\xbf] |
[\xf1-\xf3] [\x80-\xbf] [\x80-\xbf] [\x80-\xbf] |
\xf4 [\x80-\x8f] [\x80-\xbf] [\x80-\xbf]
)*\z/nx
0198デフォルトの名無しさん2008/03/03(月) 21:16:12
ジス イズ ア ペン。
0199デフォルトの名無しさん2008/03/04(火) 01:38:47
>>178
file.flock(File::LOCK_EX) よりも前に、File.open('data.dat','w') の時点でファイルの内容がクリアされてしまっている。

File.open('data.dat', File::WRONLY|File::CREAT) {|file|
file.flock(File::LOCK_EX)
file.truncate(0)
file.write(data)
}

…のようにすればいいんじゃないかな。
0200デフォルトの名無しさん2008/03/04(火) 03:28:37
>>197
Kconv::RegexpEucjp と Kconv::RegexpUtf8 だな
いわゆる全角文字と半角カタカナだけ欲しい場合は [\x00-\x7f] だけの行を消すといい

irb> puts 'aa康1アアア1煕表示字典ねdこd'.scan(/(?:\x8e[\xa1-\xdf]|\x8f[\xa1-\xdf][\xa1-\xfe]|[\xa1-\xdf][\xa1-\xfe])+/n)
康
アアア
煕表示字典ね
こ
02011782008/03/04(火) 07:36:00
>>191
File.rename使って色々やってみたんですが
やはり上手く行かなくて…

>>199

> File.open('data.dat','w') の時点でファイルの内容がクリアされてしまっている。
それはそうですね、確かに。

ちなみに、以下のコードみたいにする事で、だいぶ頑丈になりました!

#Read
File.open(path, 'r'){|f|
f.flock(File::LOCK_SH)
data = f.read
}

#Write
File.open(path, File::WRONLY | File::CREAT){|f|
f.flock(File::LOCK_EX)
f.rewind
f.write(data)
f.truncate(f.tell)
}

#Append
File.open(path, 'a'){|f|
f.flock(File::LOCK_EX)
f.seek(0, File::SEEK_END)
f.write(data)
}
0202デフォルトの名無しさん2008/03/04(火) 11:22:04
どうして atomic な方のディレクトリロックを使わないん?
0203ルファー ◆XSlQ/Lfer. 2008/03/04(火) 12:48:34
Win32APIライブラリを使い、DLL関数から文字列を取得するにはどうすれば良いんですか?
ツクール(http://tkool.jp/products/rpgxp/)のRGSS1を使っているので、バージョンアップできないし、
ライブラリはRubyで作らないとrequireできないし・・・。
0204デフォルトの名無しさん2008/03/04(火) 13:07:45
>>203
http://www.google.com/search?num=50&hl=ja&q=RGSS+Win32API&lr=lang_ja
0205ルファー ◆XSlQ/Lfer. 2008/03/04(火) 13:11:44
>>204
あぁ、解決しました。ありがとうございます。
0206デフォルトの名無しさん2008/03/04(火) 13:14:27
うわあ…
0207デフォルトの名無しさん2008/03/04(火) 13:40:32
1レスで解決したならそれはそれでいいじゃん
0208デフォルトの名無しさん2008/03/04(火) 16:42:14
標準添付のWeb::Agentって使ってる人いる?
0209デフォルトの名無しさん2008/03/04(火) 20:58:32
ruby -v; egrep '¥<Web¥>' **/*(.)
ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]
webrick/httprequest.rb: # (http://Web.Golux.Com/coar/cgi/)
webrick/httpservlet/filehandler.rb: # (Web Distributed Authoring and Versioning)

どこにあるクラス?
0210デフォルトの名無しさん2008/03/04(火) 22:17:54
Noraは標準添付ではない。
0211デフォルトの名無しさん2008/03/06(木) 06:35:30
例えばCで定義された以下の様な構造体があって
その構造体のデータが格納されたデータファイルを
1レコードずつRubyスクリプトで読み込む時に

struct Record{
char n, int a, int b;
};

以下の様な、なんだか非効率な方法しか分かりません…
とりあえず、一括してreadして、あとで上手くunpackで切り分けとか出来ないでしょうか?

File.open('data.dat', 'rb'){|f|
while !f.eof?
n = f.read(1)
a = f.read(4)
b = f.read(4)
data.push(n.unpack('L')[0].to_s + ',' + a.unpack('S')[0].to_s + ',' + b.unpack('L')[0].to_s)
end
}
02122112008/03/06(木) 06:38:11
× data.push(n.unpack('L')[0].to_s + ',' + a.unpack('S')[0].to_s + ',' + b.unpack('L')[0].to_s)
○ data.push(n.unpack('c')[0].to_s + ',' + a.unpack('i')[0].to_s + ',' + b.unpack('i')[0].to_s)
0213デフォルトの名無しさん2008/03/06(木) 08:08:47
>>211
# char n の後ろに3バイトのパディングがあると仮定して
data << f.read(12).unpack('cxxxii').join(',')
02142112008/03/06(木) 11:22:00
>>213
あ、レスどうも。

一応以下みたいなコードでだいぶマシになりました。
あとはループ展開するとかで、どうにか納得いく速度が出せそうです。

tmp = ''
data = []
File.open('data.dat', 'rb'){|f| data = f.read }
(tmp.size / 9).times{
(n, a, b) = tmp[p, 9].unpack('LSL')
p += 9
data.push(n + ',' + v + ',' + b)
}
02152112008/03/06(木) 11:23:35
× (n, a, b) = tmp[p, 9].unpack('LSL')
○ (n, a, b) = tmp[p, 9].unpack('cii')
0216デフォルトの名無しさん2008/03/06(木) 12:37:48
見てるこっちが切なくなるやりとりだな・・・
0217デフォルトの名無しさん2008/03/06(木) 12:51:12
pで表示すると、
"hoge"
とカッコ付きで表示されます。
hoge
とカッコなしで表示するにはどうしたらいいですか?
0218デフォルトの名無しさん2008/03/06(木) 12:54:06
print
0219デフォルトの名無しさん2008/03/06(木) 12:57:41
え?pってprintの略じゃなかったんですか…
02202112008/03/06(木) 13:15:50
>>216
何かもっと良い方法があればご教示下さい><
0221デフォルトの名無しさん2008/03/06(木) 14:08:49
>>219
そういう解説をしてるサイトか書籍があったら即晒せ
02222112008/03/07(金) 02:24:18
これ以上良い方法が思いつかない…

data = []
File.open('data.dat', 'rb'){|f|
tmp = f.read
cnt = tmp.size / 9
a = tmp.unpack('cii' * cnt)
cnt.times{|i| data.push([a[3 * i], a[3 * i + 1], a[3 * i + 2]].join(',')) }
}
0223デフォルトの名無しさん2008/03/07(金) 03:07:28
効率といっても速度なのかメモリフットプリントなのかコードサイズなのか
data = f.read.enum_for(:scan, /.{9}/m).map {|x| x.unpack('cii').join(',') }

あと、>>213が書いてるけど、パディングは考慮してある?
処理系によっては#pragma packeとか
02242112008/03/07(金) 03:39:45
>>223
効率は速度です><

>パディングは考慮してある?
ちょっと説明の仕方が悪かったです…
要するに、[1][4][4] の各バイトのデータの並びという事です(バディングは考慮する必要はないです)

変な説明をしてすみませんでした!><
0225デフォルトの名無しさん2008/03/07(金) 09:55:09
>>217
ダブルクォートをカッコと呼ぶやつは初めて見た。
0226デフォルトの名無しさん2008/03/07(金) 11:30:10
カッコ悪い呼び方だよな
0227デフォルトの名無しさん2008/03/07(金) 15:05:55
審議中AAry
0228デフォルトの名無しさん2008/03/07(金) 15:13:38
Float のメソッドで、
「0 から遠い方に丸める(切上げ)メソッドはありません。」
のはなんでだろう?

truncate (to_i) との対称性から、あってもバチは当たらないと思うんだけど。
やっぱ名前?
0229デフォルトの名無しさん2008/03/07(金) 18:16:19
【審議チュウ】

   (⌒ー⌒) (⌒ー⌒)
(⌒-⌒)´・ω)(・ω・`(⌒ー⌒)
(  ´・ω ー⌒)(⌒ー⌒)ω・` )
| U(  ´・) (・`  ) と ノ
〜-u (l    ) (     ノu-u'〜
    〜'u-u'  `u-u`〜






               _
            /´  `フ
           /      ,!
           レ   _,  r ミ       (⌒ー⌒)
          /  `ミ __,xノ゙、      r(   ´n
.         /        i        >   ,/   (⌒ー⌒)
         ,'    .     ,'     〜'oー、_)     r(   n)
        ;     ',  l  l                `/  <_
        i       |  | |              〜'し -一┘
      ,.-‐!     ミ  i i                     (⌒ー⌒)
     //´``、    ミ  、 ー、                   ( ´・ω)
.    | l    `──-ハ、,,),)'''´                 〜、/  っっ
     ヽ.ー─'´)                   (⌒ー⌒)   └ー-、ぅ
        ̄ ̄                      r、´・ω・))
                  (⌒ー⌒)      >  _/´
        n__n        (´・ω・`)    〜'し-一┘
      (⌒ー⌒)ノ         c'   っ
    c('・ω・`)っ      〜(_,'ーo'
0230デフォルトの名無しさん2008/03/07(金) 18:55:39
なんだかわからんがなごんだ
0231デフォルトの名無しさん2008/03/07(金) 21:00:49
ショッピングカートを作っています。
session["cart"]=Hash.new
session["cart"][@itemid]=@amount
のような形でsession["cart"]にハッシュを詰め込みたいのですが、
sessionにハッシュを詰め込むことは無理なのでしょうか?
また、無理であればto_aで配列に変換して詰め込もうと思うのですが、
元に戻すとき、
@tempSession=Hash[*session["cart"].flatten]
と、WEBの公式マニュアル(ハッシュの項)にあるようにやっても
うまくいきません…。
どなたかご教授いただければ幸いです。
0232デフォルトの名無しさん2008/03/07(金) 21:03:38
なお、使っている鯖はlolipopで、Rubyバージョンは1.8.2です。
よろしくお願いいたします。
0233デフォルトの名無しさん2008/03/08(土) 11:53:03
>>231
デフォルトだと文字列しか格納できない。
任意のオブジェクトを格納するには CGI::Session::PStore を使う。
require 'cgi/sesion/pstore'
session = CGI::Session.new(cgi, 'database_manager'=>CGI::Session::PStore)
session[key] = Hash.new
0234231-2322008/03/08(土) 12:52:26
>>233さん
書き込み後、文字列→配列へ変換→処理→文字列へ返還でできましたが、
やはりコードが汚くなったので悩んでいました。
PStoreについて勉強してみようと思います。
これで悩みが解決しそうです。ありがとうございました!
0235デフォルトの名無しさん2008/03/08(土) 14:00:53
>>234
JSON や YAML の文字列に変換するという手もある。
0236デフォルトの名無しさん2008/03/08(土) 14:16:02
「文字列→配列へ変換→処理→文字列」と似たようなシロモノ紹介してどうする
0237デフォルトの名無しさん2008/03/08(土) 15:27:12
はあ?YAMLやJSON使うなら手軽だしコードが汚くなることもないじゃん。
ちゃんとメリットあるものを紹介してなにが悪いの?
0238デフォルトの名無しさん2008/03/08(土) 15:36:34
net/httpについての質問です。
対象ページの[keywords][description]を取得したいのですが
http.getで返ったボディを正規表現で抜き出す以外によい方法はないでしょうか?
宜しくお願いします。
0239デフォルトの名無しさん2008/03/08(土) 15:43:58
>>237
236じゃないが、
突っ込む前と取り出した後に処理がいらうってとこの
面倒くささは大して変わらないじゃん。
CGI::Session::YAMLStoreとかをこさえて使うなら
アリだろうけど。
0240デフォルトの名無しさん2008/03/08(土) 16:06:45
>>238
[keywords][description] というのが何を指してるのかイマイチよーわからんが

<meta name="keywords" content="Ruby,初心者,プログラミング" />
<meta name="description" content="プログラミング言語Rubyの初心者が集うスレです。" />

というようなののことを指してるのだと勝手に解釈

特定のページのkeywordsとdescriptionの2つにしか興味がないというのなら、
特定のページ専用の正規表現で最初にマッチする文字列を抜き出すのが素直だし時間もかからない

どんなページのどんな変態HTMLが来るのかわからないというのなら、HpricotとかのHTMLパーサを使うといい
0241デフォルトの名無しさん2008/03/08(土) 16:39:04
>>240
レスありがとうございます。
おとなしく正規表現で取得しようと思います。
0242デフォルトの名無しさん2008/03/08(土) 19:52:15
変数名を代入した変数を使って新しい変数を作るにはどうしたらいいですか?
PHPで言う$$var = 'value'
みたいなことをしたいのです
0243デフォルトの名無しさん2008/03/08(土) 20:33:46
そんな曲芸みたいな処理は本当に必要なのか?
0244デフォルトの名無しさん2008/03/08(土) 21:04:35
インスタンス変数ならinstance_variable_get/setで出来ることはできる。
0245デフォルトの名無しさん2008/03/08(土) 22:05:57
Threadで引数に渡した値はthread内のローカル変数として使われて、他のスレッドの影響を受けないというような事が書いてありますが、つまりこういう事なんですか?

foo = 1
a=1
Thread.new( foo ){ | bar |
bar += 10
a += bar
hoge = a
}

この場合、barの値は他のスレッドの影響は受けないが、aは他のスレッドの影響を受けて値が変わってしまう。

bar は常に11が入っている状態になるが、aは他スレッドの影響を受けた場合、11とは限らない。

影響を受ける変数とそうでない変数との違いがいまいち分からん・・・。
0246デフォルトの名無しさん2008/03/08(土) 22:45:41
え、単なる変数のスコープの問題なんじゃないん?
0247デフォルトの名無しさん2008/03/08(土) 23:19:54
え、そうなん?
ちょっと考えてみる。。。
0248デフォルトの名無しさん2008/03/09(日) 00:09:29
あ、ブロックの問題か。
他のスレッドの影響を受けるような物って、どうやって作るんだ。
あれあれ。
0249デフォルトの名無しさん2008/03/09(日) 00:21:16
リファレンスの例がそのまま分かりやすいと思うけど

for i in 1..5
# スレッド内のiが書き換わる可能性がある
# Thread.start { p i }

# スレッド固有のローカル変数になる
Thread.start(i) {|t| p t }
end
0250デフォルトの名無しさん2008/03/09(日) 01:04:04
それはブロックの問題にならないのか。。

#1
foo = 1
Thread.new{
foo +=10
}

ってのと
#2
for i in 1..5
Thread.new{ p i }
end

って両方ともスコープの問題なように思えてしまいます。
#2は他スレッドの影響で i の値が変わるのではなく、外側のスコープの
i が変わっているから変わってくるのでは?
#それともそういうつもりで書かれたんですかね。



0251デフォルトの名無しさん2008/03/09(日) 01:25:56
ThreadのMutexの使いどころって言うのは、

1同じスコープを共有している
2同時に実行されている処理がある

1、2が当てはまる場合で、かつ2の両者が同じ変数をアクセスする際に
Mutexは使うべきなんだと思うんですが、スレッドの処理がまるまるメソッド化
されている場合はそもそも1が当てはまらないから、Mutexは必要ない
って認識でOKですか?

#ex.
i=0
th = []
def thread_run
puts i
end

1000.times{
th.push Tread.new{ thread_run }
}

while true
i += 1
puts i
end
02522502008/03/09(日) 01:30:13
いや、やっぱ

for i in 1..5
 Thread.new{ p i }
end

は他スレッドの影響を受けているのか。
そう公式リファに書いてあるもんなw

他スレッドの影響で i が書き変わって、
かつ、i はブロックの外側のスコープだから
影響を受けてしまうっちゅーことか。
0253デフォルトの名無しさん2008/03/09(日) 08:35:45
スレッド生成した直後にスレッドの処理が終了するようなテストじゃ
よそのスレッドの影響受けてるかどうかもわからんだろ
for i in 1..5
 Thread.start(i) {|n| sleep(n) ; puts 'i = %d : n = %d'%[i,n] }
end
0254デフォルトの名無しさん2008/03/09(日) 16:05:40
「特定のWebサイトにある特定の動的HTMLを取得して解析してデータを蓄積・別途表示するよスクリプト」
というありがちなものを頑張って作ってます

で、最近微妙にスレでも話題なRSpecとか使ってテストとかしようと思ったんですが、
「Webサイトに接続してHTMLを取得するかわりにローカルのHTMLファイルを読み込ませたい」です
定番の書き方とか方法とか考え方とかありますか
0255デフォルトの名無しさん2008/03/09(日) 16:21:39
>>253
でたなsprintf厨
0256デフォルトの名無しさん2008/03/09(日) 16:27:34
>>255
でも文字列への埋め込みよりは論理的にも見える
ていうか指示子覚えちゃったら結構どっちもどっちだよね
0257デフォルトの名無しさん2008/03/09(日) 16:47:32
>>254
とりあえず
「アクセス用URIを作るクラス」
「URIを引数で受け取ってHTMLを取得しそのまま返すクラス」
「HTMLを引数で受け取って解析しデータ構造にして返すクラス」
「データを引数で受け取ってDBとかに保存するクラス」
とか細かく分けるんだ
0258デフォルトの名無しさん2008/03/09(日) 16:56:12
>>253 がそうかは知らないけど
Python 使ってると Ruby でもそう書きたくなる
5.times じゃなくて for i in 1..5 してるのもそれっぽいと感じた
関数のカッコも省略してないし
0259デフォルトの名無しさん2008/03/09(日) 18:57:30
Rubyのライブラリリファレンス本て結構いい値段するけど
ネットで見れるマニュアルに比べてのアドバンテージって何ですか?
検索も出来ないし、買う意味あるのかなーと思うんですが。
0260デフォルトの名無しさん2008/03/09(日) 18:59:25
結局はwindowsのHTMLヘルプが一番いいね
0261デフォルトの名無しさん2008/03/09(日) 19:01:28
>>259
金光編のなら、持ってますが、買う価値ないです。
0262デフォルトの名無しさん2008/03/09(日) 19:10:21
>>259

・ まじめな意味でお布施
・ オンラインヘルプの利用ができない環境向け
・ 安くない本を買ったんだからと自分を追い込む用
0263デフォルトの名無しさん2008/03/09(日) 19:17:12
return self
(returnなしでも桶)の効用がわかった気がする
0264デフォルトの名無しさん2008/03/09(日) 19:24:33
半年前の自分のスクリプトはいい意味でも悪い意味でも読めないよね
Perlでの妙な凝りっぷりほどじゃないけどさ
0265デフォルトの名無しさん2008/03/09(日) 19:41:28
ちょっと聞きたいんだけど、

irb(main):001:0> require "kconv"
=> true
irb(main):002:0> puts "シーソーゲーム".kconv(Kconv::UTF8, Kconv::SJIS).kconv(Kconv::SJIS, Kconv::UTF8)
シーメ[ゲーム
=> nil

ってやると元通りのものが帰ってきてくれないのはなんでなんだぜ?
0266デフォルトの名無しさん2008/03/09(日) 20:02:55
rubyのバージョンとかは?
0267デフォルトの名無しさん2008/03/09(日) 20:05:05
バージョンあんま関係ないと思うぞ
irb> p "シーソーゲーム".kconv(Kconv::UTF8,Kconv::SJIS)
"\343\202\267\343\203\274\343\203\241[\343\202\262\343\203\274\343\203\240"
0268デフォルトの名無しさん2008/03/09(日) 20:09:06
それ単純に$KCODEが適切じゃないだけだと思う
puts "シーソーゲーム"でもシーメ[ゲームって出力されるだろ多分
0269デフォルトの名無しさん2008/03/09(日) 20:23:12
$KCODEのデフォルトは日本語環境のWndowsであろうが、NONE
0270デフォルトの名無しさん2008/03/09(日) 20:24:20
>>266
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]

>>268
ぬぉほんとだ
勉強不足だったみたいだ 調べてくるありがとー
0271デフォルトの名無しさん2008/03/09(日) 21:02:16
すまんもーいっこ聞きたいんだけど、ある変数ではSJISで、ある変数ではUTF8で持つとかってできないの?

test = "シーソー"
puts test.kconv(Kconv::UTF8, Kconv::SJIS)

で、ruby -Ks hoge.rb とかすると意図した通りUTF8で"シーソー"って出てくるけど、$KCODE = "SJIS"とかだとうまく動いてくれんのだが…
2種混在とか無理なのか?
0272デフォルトの名無しさん2008/03/09(日) 21:10:17
>>271
できるよ
というかStringオブジェクト自体には文字コードの情報は付記されてない
内容を表示したり正規表現にマッチさせたりするときに利用メソッド側で改めて調べてる
0273デフォルトの名無しさん2008/03/09(日) 21:24:28
>>272
そうなのかー
リファレンス見ると、KCODEが影響するのは
* インタプリタの字句解析器 etc
って書いてあるけど、これって例えば
test = "シーソー"
の "シーソー" を評価するときにKCODEを元に評価してtestに代入するってこと?

つか
$KCODE = "SJIS"
test = "シーソー"
puts test
ってやっても文字化けるのが納得いかん
irbとかでやると化けずにでるのも意味がわからん…
0274デフォルトの名無しさん2008/03/09(日) 21:35:55
#!ruby -Ks
test = "シーソー"
puts test
0275デフォルトの名無しさん2008/03/09(日) 21:38:31
>>274
それでちゃんとできるのは知ってる
$KCODEだとできたりできなかったりするのが不思議な昨今です
0276デフォルトの名無しさん2008/03/09(日) 21:41:34
>>273
あ、悪い、$KCODEについては誤解がけっこう蔓延してる
$KCODE='s'はRubyスクリプトだから、これが解釈されるということは既に実行済みってことでそのファイルについては手遅れなんだ
(それ以降にrequireとかで読み込んだファイルは$KCODEにしたがって解釈してくれる)

スクリプトの先頭からShift_JISだと認識した上で読み込んで実行してくれないと困るので、普通は-Ksを使う
Windows版Rubyでも、 1行目に
#!ruby -Ks
とか適当に書いておくだけで、スクリプト解釈前(構文木生成前)に適当に解釈してくれる

スクリプトを読み込む
    ↓ -Ks の出番
スクリプトを解釈する
    ↓
プログラムを実行する
    ↓ $KCODE='s' の出番
0277デフォルトの名無しさん2008/03/09(日) 21:48:52
スクリプト中に書き込まれた日本語文字列に駄目文字がなければ
$KCODE='NONE'(つまり #!ruby -Ks 無し)でも動くんだよ
駄目文字があった場合はうまく動作しない
Ruby作者さんも言っとる

ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/41939
> まつもと ゆきひろです
> |あまりよい解決方法ではないかもしれませんが,二行目に
> |$KCODE='SJIS'
> |とするとruby -Ksと同じ挙動になると思います.
> |
> |#!/usr/bin/env ruby
> |$KCODE='SJIS'
> |
> |のような感じでどうでしょう.
>
> 残念ながら「$KCODE='SJIS'」の解釈は実行時に行われるので、プ
> ログラムの読み込みを行う時点での処理が行われません。たとえば
> ソースコードがSJISであった場合に文字列中の「表」などの処理が
> 適切に行われないことになります。
0278デフォルトの名無しさん2008/03/09(日) 22:21:01
require したファイルの名前って一覧できますか。
0279デフォルトの名無しさん2008/03/09(日) 22:23:14
>>278
irb> p $"
["irb.rb", "e2mmap.rb", "irb/init.rb", "irb/context.rb", "irb/workspace.rb", "irb/extend-command.rb",
"irb/ruby-lex.rb", "irb/slex.rb", "irb/ruby-token.rb", "irb/input-method.rb", "readline.so", "irb/locale.rb",
"kconv.rb", "nkf.so"]
0280デフォルトの名無しさん2008/03/09(日) 22:25:29
>>278
$" ($LOADED_FEATURES)

0281デフォルトの名無しさん2008/03/09(日) 22:27:09
>>279,280
さんくすです

もいっこ質問。
PHPとRubyとで、Webアプリのセッション情報を共有することはできますか。
0282デフォルトの名無しさん2008/03/09(日) 22:28:59
>>281
テキストでファイルに保存あるいはテキストベースで遣り取り可能ならできんじゃね
0283デフォルトの名無しさん2008/03/09(日) 22:36:49
memcachedとかでもイケそう。
0284デフォルトの名無しさん2008/03/09(日) 22:51:30
セッション情報って別に形式決まってないよな
0285デフォルトの名無しさん2008/03/09(日) 23:44:58
>>276
そうなのかー
$KCODE = "SJIS"を読んだ時点で設定が変更されんのかと思った
つーことはファイル毎に文字コードの設定が可能ちぅことか

>>277
ソースまで発掘してもらって申し訳ねぇ
でも2行目でやればいいってのはなんでなんだろう?
Rubyってインタプリタなんじゃないの?
読み込んだ片端から逐次実行なんじゃないの?
わかんねー
0286デフォルトの名無しさん2008/03/10(月) 00:09:27
1.8は構文木、1.9は中間コードに一旦変換してるが、インタプリタには違いない
ttp://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF
0287デフォルトの名無しさん2008/03/10(月) 00:14:18
1. -Kオプションを解釈
2. パース
3. 実行

ソース中の「表」とかが問題になるのは2の時点、
$KCODEへの代入が実行される3の時点では手遅れ
0288デフォルトの名無しさん2008/03/10(月) 00:32:56
>>286-287
全部一旦構文木にしてから実行すんのか?
Rubyって前方宣言じゃなかったっけ?

前方宣言だよなぁ→読み込み即実行だよなぁ→$KCODEに値代入した時点で即有効になる気がするよなぁ
っていう発想なんだが…
0289デフォルトの名無しさん2008/03/10(月) 00:42:34
宣言してるというより実行時に作り上げてるだけ
0290デフォルトの名無しさん2008/03/10(月) 02:01:50
なんか勝手な前提で色々考えてる感があるが…
$KCODE = "SJIS"
↑これだって単なる代入式なんだから実行されるまで作用しないだろ。

前方宣言どころかクラス定義やメソッド定義まで実行文だぞ。
0291デフォルトの名無しさん2008/03/10(月) 06:51:16
配列自体をeachで変更したいのですが、どうしたらいいですか?
破壊的メソッドは!を付けるので
each!とかやってみたのですが駄目でした
0292デフォルトの名無しさん2008/03/10(月) 07:00:14
>>291
要素数が同じでいいなら普通はmap!やcollect!を使う

irb> arr = [1,2,3]
irb> arr.map!{|e| e*2}
irb> p arr
[2, 4, 6]
0293デフォルトの名無しさん2008/03/10(月) 07:04:59
>>292
おお!ありがとうございました
0294デフォルトの名無しさん2008/03/10(月) 07:19:01
mapでの写像を覚えるとRubyコードのステキ度が100単位でアップするので超お勧め

「配列の要素をひとつずつ取り出して計算してひとつずつ格納する」から
「ある配列にブロックを作用させてもうひとつの配列を作る」という思考と記述が自然に行えるだけで超絶パラダイム
昨日までの小学生レベルのプログラムの勉強とはオサラバよオ・サ・ラ・バ
0295デフォルトの名無しさん2008/03/10(月) 16:36:07
WinXPで音声編集をできるライブラリがあったら教えてください。
RAAを見た限りではなさそうですが。

1. 1秒以上の無音部分で音声ファイル分割
2. file1とfile2を、間に1秒無音部を入れて結合

というような事をやりたいです。
0296デフォルトの名無しさん2008/03/11(火) 01:17:52
流れをぶった切ってスマソ
0297デフォルトの名無しさん2008/03/11(火) 01:19:28
ww二重書き込みスマソ

MySQL を Ruby DBI モジュール で抽象化してアクセスしてるんだが,DBエンジンってどうやって選択するのか,さっぱりわからん.
どのドキュメント読んだら良いんだろ・・・
0298デフォルトの名無しさん2008/03/11(火) 01:26:27
すまん…自己解決の悪寒
0299デフォルトの名無しさん2008/03/11(火) 02:14:46
Windowsでシェルスクリプト的な使い方をしようと思っていますが
コマンドプロンプトで
>ruby hoge.rb
と入力するのではなく、
>hoge.rb
と入力してrubyスクリプトを起動させる方法があれば教えて下さい
0300デフォルトの名無しさん2008/03/11(火) 02:19:10
>>299
assoc
0301デフォルトの名無しさん2008/03/11(火) 02:33:10
自分のいるディレクトリを取得するのに、
dir = File.dirname(File.expand_path( __FILE__))
と書いてますが、File.が重複してるのが気になります。
もっとキレイに書けますか?
0302デフォルトの名無しさん2008/03/11(火) 02:33:39
普通にhogeで実行できる
0303デフォルトの名無しさん2008/03/11(火) 03:07:16
>>302
それはそういうふうに設定されてるだけ
まあWin98くらいから使ってる人は試そうとしないことも多いけどな

>>301
無理
まあフルパスくらい一発で出てくれとは思わなくもないが…
0304デフォルトの名無しさん2008/03/11(火) 03:13:06
>>300
ありがとうございます
こういうコマンドがあったんですね
>>302
確かに試したら出来ました
One Click Rubyが設定したみたいですね
0305デフォルトの名無しさん2008/03/11(火) 04:04:13
ある変数(仮に command としよう)に入っている文字列オブジェクトを
コマンド出力として解釈させるためには
%x{ command }
でいいの?
0306デフォルトの名無しさん2008/03/11(火) 04:09:41
%x{#{command}}
0307デフォルトの名無しさん2008/03/11(火) 04:13:00
>>301
__FILE__ はそれが記述されているファイルの場所だから
ruby path/to/script/files/hoge.rb とかしたら
カレントディレクトリは取得出来ない。
Dir.pwd Dir.getwd を使え。
dir = File.expand_path(Dir.pwd)
または
require 'pathname'
dir = Pathname.pwd.to_s
0308デフォルトの名無しさん2008/03/11(火) 08:27:36
>>307
> dir = File.expand_path(Dir.pwd)
Dir.pwdがすでにフルパス。
0309デフォルトの名無しさん2008/03/11(火) 11:00:39
>>307
誰がカレントディレクトリを欲しいなんて言ってるんだ?
File.dirname(File.expand_path(__FILE__)) は正しく「このスクリプトのあるディレクトリ」を返す
…まあ、「自分のいるディレクトリ」ってなんだよとは思わなくもないが

あと、 File.expand_path(__FILE__) は ruby への引数の書き方によらず必ず絶対パスを返す
問題があるとすれば、スクリプト内で cd してカレントディレクトリが起動時から変わってしまった場合
カレントディレクトリとくっつけて返すだけなので「絶対パスの形をしてるけど実際には存在しない」パスになる
0310デフォルトの名無しさん2008/03/11(火) 11:52:50
eRubyについて教えてください。
ロリポップを使っています。
htmlタグの中にRubyスクリプトを埋め込みたいと思っています。
[現在のサーバーの状態(ロリポップ初期状態です)]
Ruby 1.8(/usr/local/bin/rubyがパスです)
SSIは.shtmlで使える

.htaccessの設定か何かが必要だということまでは調べたのですが、うまく動きません。
現在.htaccessを色々いじって、
AddType application/x-httpd-eruby .rhtml
Action application/x-httpd-eruby /usr/local/bin/eruby ★←この部分でeRuby?のパスを指定するっぽい??
のようにしてみたのですが…多分全く違うのでしょう、、404エラーになります。
(アドレスも正しいのに何故404エラーになるのか不明です;)

次にロリポップではSSIについてという項で
SSIは拡張子を.shtmlにして下さい
とあるので、test.shtmlとしてアップロードしました。
以下がそのソースです。
<html><body><p><%="Just another Ruby Hacker,"%></p></body></html>
結果は画面は真白で、ソースを見ると上のまま出力されていました。
(<%=とかもそのまま文字として出力される)

ちなみに言うまでもありませんがサーバーの設定等の知識は全くありません。
「ここを読めば分かる」や「多少のヒント程度」でも構いません。
藁をも掴む思いです。。。
ある程度は検索して調べたのですが、なかなかまとまったものが無く、分りませんでした。
お前のサーバーの.htaccessはこうやるんだ! というものがあればすごく有り難いです。

よろしくお願いいたします。
0311デフォルトの名無しさん2008/03/11(火) 12:11:46
195 名前: 留学生(福島県)[] 投稿日:2008/03/11(火) 11:44:25.61 ID:piKUy7Sw0
>>149
そのつもりでrubyスクリプトかいてるんだけど、うまくいかない

r = "<a href=\"../test/read.cgi/news4vip/1205110121/48\" target=\"_blank\">>>48</a>"
r.gsub!(/<a\shref=(.*?)>>>(\d+)<\/a>/, "<a href=\"#{$2}\">>>#{$2}</a>")

$2に48が入ってるはずなんだけど、できない
だれか助けろ
0312デフォルトの名無しさん2008/03/11(火) 12:24:59
>>311,\2な
0313デフォルトの名無しさん2008/03/11(火) 12:29:24
ブロック使え
0314デフォルトの名無しさん2008/03/11(火) 12:31:03
>>310
アカウントとパスワードを書いてから
0315デフォルトの名無しさん2008/03/11(火) 12:39:11
>>314
もし方法がわかればお願いします。
0316デフォルトの名無しさん2008/03/11(火) 13:27:41
>>310
そもそもロリポップにはerubyがインストールされていないんじゃ?
0317デフォルトの名無しさん2008/03/11(火) 14:17:59
>>316
レスありがとうございます。
Ruby1.8から標準ライブラリに組み込まれていると書いてあったのですが、
インストールされていないと使えないということなのでしょうか?
(書いていて使えないような気がしてきました…)

あと、もう一つ質問をさせて下さい。
check_zaiko.cgiというスクリプトがあり、それは
check_zaiko.cgi?item=hogeというURLにアクセスすると、
puts zaiko.to_s // "5"
といった具合に、在庫を出力する様になっています。
この出力結果を他のスクリプトで使いたいのですが、なんという関数を使えば良いのでしょうか…?
例えばview_cart.cgiというもので、
m_zaiko=load("check_zaiko.cgi?itemid=hoge")
のように結果を受け取りたいのです。
loadやevalといったものを調べましたが、loadに引数(itemid)を渡す方法がよくわかりません。
よろしくお願いいたします。
0318デフォルトの名無しさん2008/03/11(火) 14:19:50
>>313
subやgsubの"$数字"使用不可問題はある意味欠陥だよな
warning出してもいいとすら思う

r.gsub!(/<a\shref=(.*?)>>>(\d+)<\/a>/){"<a href=\"#{$2}\">>>#{$2}</a>"}

1回経験して自力で理由調べると2度と間違えなくなるけどさ
0319デフォルトの名無しさん2008/03/11(火) 14:25:24
>>317
せっかくだから自力で調べるべし
> Action application/x-httpd-eruby /usr/local/bin/eruby
は
「ファイルタイプがapplication/x-httpd-erubyに該当するなら/usr/local/bin/erubyにファイルを渡して実行」
という設定だ
/usr/local/bin/erubyがなければそもそも動作しない

ところで、erubyでないと何かまずい? erbとか使うんじゃ駄目?
0320デフォルトの名無しさん2008/03/11(火) 14:46:20
>>317後者
ふつーは、
・ check_zaiko.cgi(で使ってるファイル)を require や load する
・ CGI の引数を分解したものを直接受け取ってるクラス(のnew)やメソッドに 'itemid'=>['hoge'] を指定
・ zaiko.to_s を適当に利用する
という流れになると思う
(CGIスクリプトが出力しようとしているものを文字列として横取りするというのは方法論としては「ありえねー」)
なので、 check_zaiko.cgi の中身は

require '標準ライブラリいろいろ'
require '自作ファイルいろいろ'
require 'checkzaiko.rb'

cgi = CGI.new
zaiko = CheckZaiko.new(cgi.params)
cgi.out() do
zaiko
end

とかいう単純な中身になってることが期待される
これなら、 view_cart.cgiでは

require 'checkzaiko.rb'
m_param = {'itemid'=>['hoge']}
m_zaiko = Checkzaiko.new(m_param).to_s

と書くだけでいい
もしcgiファイルに直接メソッドとかを書いてるなら、今回のように再利用するときに非常に面倒なので
てきとーなクラスで囲って別ファイルにしてrequire で読み込んどけ
(初心者は「クラス名とは…」とか「クラスの本質はそもそも…」とかいう小難しい理論は後回しでOK)
0321デフォルトの名無しさん2008/03/11(火) 14:50:38
自分で勉強するかWebProg板に行ったほうがいいんじゃね
セキュリティそっちのけで大やけどする前に
0322デフォルトの名無しさん2008/03/11(火) 15:17:51
自前で1年勉強してもロクにセキュアなものができないのがWeプログラミング
0323デフォルトの名無しさん2008/03/11(火) 16:03:28
>>319
ERBでも良いです。というかまだERBについては勉強していないので、
また勉強してつまづいたら質問させて頂くことにします。
(ERBで行くという方針が決まったので助かりました。ありがとうございます。)

>>320
衝撃でした;もうすでに幾つかCGIに直書きしてしまっているので、
今からはこれをアドバイス通りrbにしていくことにします…。
本当に基本的なことみたいですが、知りませんでした!ありがとうございました。

>>321,322
>>322さんご指摘の通り、自前で全部やっています。
セキュリティについてはセッションハイジャックの仕組み等、概念は勉強しましたが、
肝心の自分のコードでどのようにするかのノウハウが無く、
これでは、やけどする可能性が非常に高いですよね。
ご指摘の通り、WebProg版なども見てみようと思います。
(色々引っ掛かりすぎてるせいか、自前だと時間が本当ににかかるんですね;)

>>319-322さん、レス本当にありがとうございました!
またよろしくお願いいたします。
0324デフォルトの名無しさん2008/03/11(火) 16:56:58
>>322
まあ、業界も飯の種を垂れ流して平気なほどバカではないってことだな
フレームワーク使って検索と独学で勉強しただけでセキュリティ的に堅固なプログラムが作られたら正直困るわけで
0325デフォルトの名無しさん2008/03/11(火) 17:16:05
>>295
ruby/audio ってのがあったけど、WinXPで使えるかどうかよくわからん。
あとは適当にosalpのラッパ書いちゃうとか。
でも、わざわざruby使わんでもmp3splt/mp3wrapでいいんじゃ?
0326デフォルトの名無しさん2008/03/11(火) 17:17:34
外部コンソールプログラムに丸投げするのが正解のような気がするな
というか、仮に何かライブラリがあっても特定の外部プログラムのラッパーだと思う…
03272952008/03/11(火) 18:58:41
>>325
Mp3splt/Mp3Wrapがまさに差がしていたものです。
ありがとうございます。

>>326
Rubyにファイル名管理させて、処理はMp3splt/Mp3Wrapに任せます。
0328デフォルトの名無しさん2008/03/11(火) 22:36:09
このレベルの人からzaikoなんてワードが出てくると少々ヒヤッとするね。
まぁ、業務アプリってもイントラならそれほど酷いことにはならんかも知れんが
0329デフォルトの名無しさん2008/03/11(火) 23:33:03
いや、実際問題としてRubyで普通に作っただけでは運用に耐えられないはず
Rubyプログラミング以外の知識がどうしても要る
0330デフォルトの名無しさん2008/03/11(火) 23:42:41
複数行モードな正規表現をファイル全体に適用し置換をしたいのですが
ファイルが巨大な場合、変数に全部読むのがためらわれます

=~の中の人(Regexpの中の人?)がもっと読みたくなったらその都度FileやIOなどから
読んでいただくみたいなのを妄想してるのですが
そんな素敵モジュールはすでにあったりするのでしょうか?

0331デフォルトの名無しさん2008/03/11(火) 23:51:31
>>330
1レコード1KBでも1GBじゃん。32bitのメモリ空間埋めるのに、
1万円でおつりが出る時代なんだから、気にしないと言うのも
それはそれでアリかとw
0332デフォルトの名無しさん2008/03/11(火) 23:54:44
今の子はPCのメモリに種類があることも知らなくて困る
03333052008/03/12(水) 00:09:43
>>306
アリガトン
0334デフォルトの名無しさん2008/03/12(水) 08:59:31
>>331
>1レコード1KBでも1GBじゃん。
どういう計算?行数は出てきてないと思うけど?
0335デフォルトの名無しさん2008/03/12(水) 09:22:02
100万件ほどって事だろうね。
しかし今はホントPC安いよなぁ。
10万くらいだせば、安いショップなら自作機作っても
デスクトップならQuadコアのいいマシンが手に入るからなぁ。
0336デフォルトの名無しさん2008/03/12(水) 09:22:33
rubyでの掲示板の作り方教えろ
0337デフォルトの名無しさん2008/03/12(水) 09:58:14
>>336
他人に直接聞かないと作れないようでは君には無理だ
あきらめろ
0338デフォルトの名無しさん2008/03/12(水) 10:18:32
>>336
Perl,PHPなんかで書かれたものを
とりあえずRubyで書き直すとかしてみれば色々勉強になるんでは?
というか、自分はそうしたけど。
0339デフォルトの名無しさん2008/03/12(水) 11:33:46
rubbsの解説があったのって256本だっけ?
0340デフォルトの名無しさん2008/03/12(水) 12:47:16
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
で、Windows版Rubyでスクリプトを読み込ませるとウンコみたく遅いです
数秒待たされてから開始されます
なんとかなりませんか
0341デフォルトの名無しさん2008/03/12(水) 13:09:46
ウンコみたく遅いのは別の原因のような気もするが、普通にワンテンポ以上遅いよね

puts Time.now

と書かれた time.rb をバッチファイル/シェルスクリプトで5行記述した結果

Debian @セレ400MHz

$ ./ichiren.sh
Wed Mar 12 13:08:09 JST 2008
Wed Mar 12 13:08:09 JST 2008
Wed Mar 12 13:08:09 JST 2008
Wed Mar 12 13:08:09 JST 2008
Wed Mar 12 13:08:09 JST 2008

Win2000 @ペンIII 863MHz

>ichiren.bat
>ruby time.rb
Wed Mar 12 13:04:15 +0900 2008
>ruby time.rb
Wed Mar 12 13:04:16 +0900 2008
>ruby time.rb
Wed Mar 12 13:04:17 +0900 2008
>ruby time.rb
Wed Mar 12 13:04:18 +0900 2008
>ruby time.rb
Wed Mar 12 13:04:20 +0900 2008
0342デフォルトの名無しさん2008/03/12(水) 14:23:59
自分で作ったプログラムの説明をriやrdocに追加することはできますか?
Emacsで「カーソルがメソッドに乗ったらミニバッファに1行解説を表示するよ機能」を使ってるんですが
自分で作ったクラスやメソッドについてもこれを表示させたいです
0343デフォルトの名無しさん2008/03/12(水) 16:47:19
boost::regex_matchの引数flagsにboost::regex_constants::match_partialを指定したみたいな感じで
正規表現に途中までマッチしたことを知るにはどうすればよいですか?
0344デフォルトの名無しさん2008/03/12(水) 17:53:57
>>340>>341
NYACUSっていうシェルだとDDE(=遅い)に頼らず
拡張子でコマンドに関連付けできる。
0345デフォルトの名無しさん2008/03/12(水) 18:31:39
色んな例外クラスを定義しまくって
問題あれば例外を投げ飛ばして
後でザクザク拾い上げるってコーディングしてたら
これってgotoと何が違うの・・・?
と思って悲しくなった
0346デフォルトの名無しさん2008/03/12(水) 18:36:34
>>345
本質的にはあんま変わらんよな
そこに気づいたらもう一歩だと思う
0347デフォルトの名無しさん2008/03/12(水) 18:53:41
「必ず」同じディレクトリにあるhoge.rbをrequireで読み込みたいです
どう書くのが普通ですか?

というか、みんな困ってないんでしょうか?
0348デフォルトの名無しさん2008/03/12(水) 19:00:17
require './hoge.rb'
0349デフォルトの名無しさん2008/03/12(水) 19:23:23
>>347
“同じディレクトリにあるhoge.rbを「必ず」requireで読み込みたい”だと勝手に補完

require '標準ライブラリ'
$LOAD_PATH.unshift(File.dirname(File.expand_path(__FILE__)))
require 'このファイルから見た自作ライブラリの相対パス'

これで桶
>>348のような書き方は
/home/user/ ディレクトリとかで
~$ ruby /home/user/myscript/main.rb
とかしたときに動作しない
0350デフォルトの名無しさん2008/03/12(水) 19:26:51
じゃあこういう場合はどうする?
a.rb、test/d.rb ともに問題なく実行するにはどうすれば??
以下のままだと、a.rb でエラーが出てしまう。

----------
[a.rb]
require 'test/b.rb'
test_print
----------
[test/b.rb]
require 'c.rb'
def test_print
print TEST_MESSAGE, "\n"
end
----------
[test/c.rb]
TEST_MESSAGE = 'Test Message!'
----------
[test/d.rb]
require 'b.rb'
test_print
----------
03513502008/03/12(水) 19:28:41
>>349
あ、ごめ
リロードする前に書き込んじゃったよ。
それは350のでも桶?
03523502008/03/12(水) 19:32:46
>>349
今試したら動いたよ。
良かった。ありがと。
0353デフォルトの名無しさん2008/03/12(水) 19:38:06
メインの a.rb で一括して
$LOAD_PATH.unshift(File.join(File.dirname(File.expand_path(__FILE__)),'test'))
というように test/ ディレクトリ以下をrequireのロードパスに登録しておくのが素直に思う
b.rb でも c.rb でも $LOAD_PATH への追加をしていくと微妙に不恰好になる
0354デフォルトの名無しさん2008/03/12(水) 21:44:35
>>338
Perlで書いたものをPHPで書き直してそれをRubyにした後Pythonになって落ち着きました
0355デフォルトの名無しさん2008/03/12(水) 23:06:38

・ 配列の後ろからn個が欲しい
・ ただし、要素数はnより少ないこともある
・ そして、nより少ない場合は少ない配列のままが欲しい

を満たす一番妥当な書き方は

arr.reverse[0,n]

でいい?
0356デフォルトの名無しさん2008/03/13(木) 00:13:01
>>355

arr.last(n) でいいんでない?

0357デフォルトの名無しさん2008/03/13(木) 00:16:01
というかなぜreverse
逆順に欲しいのか?
0358デフォルトの名無しさん2008/03/13(木) 06:32:26
rubyの一般的な命名規則はどんなのですか?
本を参考にhoge_moge_pogeって感じにしてますが
0359デフォルトの名無しさん2008/03/13(木) 07:02:45
メソッド、変数名は hoge_moge_poge
定数は HOGE_MOGE_POGE
クラス名は HogeMogePoge
だと思う。
0360デフォルトの名無しさん2008/03/13(木) 07:23:37
Matzたんのを参考にしてみれば。
でも本人は勝手に決めてと言ってるが。
ttp://www.rubyist.net/~matz/20041006.html
0361デフォルトの名無しさん2008/03/13(木) 08:18:19
指定したファイルパスまでのディレクトリが存在しない時、
mkdir -p
を外部コマンドとして実行して親ディレクトリを作成しているのですが
もっとスマートな方法はありませんか?
0362デフォルトの名無しさん2008/03/13(木) 08:35:04
>>361
FileUtils.mkpath
Pathname.mkpath
0363デフォルトの名無しさん2008/03/13(木) 14:57:39
>>359が多数派
先頭だけ小文字であとは大文字併用なローワーキャメルケース変数(hogeArrayのような)もしぶとく勢力拡大中


Railsは異境なのでよくわからん命名規則とよくわからん名前の変数やメソッドが跳梁跋扈
0364デフォルトの名無しさん2008/03/13(木) 15:02:59
たとえ途中でも大文字が入ってると目視認識時にビビるんだよね
下手に気取らずに変数やメソッドは素直に全部小文字で行って欲しい

小文字だけ → 変数やメソッド
大文字が入ってる → 定数やクラス名

これでいいじゃんね
0365デフォルトの名無しさん2008/03/13(木) 17:24:34
>>362
ありがとうございます
FileUtilsにはmkdir_pというそのままな名前のメソッドもあるんですね
0366デフォルトの名無しさん2008/03/13(木) 17:49:00
自分用汎用ライブラリってどこに置くのがベストですか?
あとphp.iniみたいな、ruby自体の設定ファイルがありませんが、
各アプリ共通のライブラリパスはどこで設定するのが綺麗でしょうか。
0367デフォルトの名無しさん2008/03/13(木) 19:21:05
ヘッダファイルの構造体定義を食わせると pack/unpack のフォーマット文字列を
自動生成してくれるような素敵なツールって無いっすかね?
0368デフォルトの名無しさん2008/03/13(木) 22:44:19
typedefとか追っかけるのがめんどいよね
C言語のyacc/lexみたいなのがいるんじゃない?
RubyだとRaccで書くことになるんかな。
03693672008/03/13(木) 23:26:32
そうそう、めんどうなんすよね。
最初は頑張ってたんですが、 vfmt.fmt.pix.height とか出てきて、さすがにめげた。
自分で parse するのも考えたんですが、
結局 pure Ruby で pack/unpack するのはあきらめて、
構造体からデータを入出力するのは拡張ライブラリで実装することにしますた。
0370デフォルトの名無しさん2008/03/14(金) 00:00:16
>>366
>自分用汎用ライブラリ
俺なら ~/lib/ruby か /usr/local/lib/ruby だな
0371デフォルトの名無しさん2008/03/14(金) 00:01:39
winなら?
0372デフォルトの名無しさん2008/03/14(金) 00:08:45
>>371
~/マイドキュメント/ruby
~/Local Settings/Application Data/ruby

あたり?

スペース入るのがいやなら
ドライブの直下に ruby/lib を作るとか。
0373デフォルトの名無しさん2008/03/14(金) 00:12:24
Winなら
C:\Ruby
以下があるはずだと思うけど
0374デフォルトの名無しさん2008/03/14(金) 00:15:02
ありがとう
0375デフォルトの名無しさん2008/03/14(金) 00:16:07
Windowsだと
ruby -e 'p $:'
の出力中に site_ruby っぽいのは含まれないの?
0376デフォルトの名無しさん2008/03/14(金) 00:57:45
>375
C:\usr\local\ruby 以下にインスコした漏れの場合

> ruby -e 'p $:'
["C:/usr/local/ruby/lib/ruby/site_ruby/1.8", "C:/usr/local/ruby/lib/ruby/site_ru
by/1.8/i386-msvcrt", "C:/usr/local/ruby/lib/ruby/site_ruby", "C:/usr/local/ruby/
lib/ruby/1.8", "C:/usr/local/ruby/lib/ruby/1.8/i386-mswin32", "."]

こーなった
ちなみに
> ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
0377デフォルトの名無しさん2008/03/14(金) 10:20:56
マイクロソフトRuby潰す宣言
「既存のRubyのライセンスはもちろん買収するつもりだ。その上でRuby.NETの開発をまつもとひろゆき氏に依頼したい」――CEO会長坂田雄太
http://an.to/?microsoft01news
0378デフォルトの名無しさん2008/03/14(金) 10:35:57
ついにあの伝説のRuby開発者、まつもとひろゆき氏が動くのか!?
0379デフォルトの名無しさん2008/03/14(金) 10:41:10
>>377のURLコピペでいくつかのスレが荒らされとるな
URL以外の内容はスレに即したものの模様
0380デフォルトの名無しさん2008/03/14(金) 10:42:13
>>377
ブラクラじゃん
0381デフォルトの名無しさん2008/03/14(金) 10:46:36
>377
春休みか?いまどきそんなチャチなものブラクラとも言わんぞ
0382デフォルトの名無しさん2008/03/14(金) 11:30:07
>>367
dl2のdl/import.rb
0383デフォルトの名無しさん2008/03/14(金) 11:58:15
顔文字をcanna用に変換したいんだけど半角カナが全角になったゆ
だれか全角カナを半角に変換する方法知らない?
0384デフォルトの名無しさん2008/03/14(金) 12:09:38
>>383
nkfに-xを付けなかったんじゃないか? 元の変換の時に。
0385デフォルトの名無しさん2008/03/14(金) 12:17:47
>>384
やってるよ
0386デフォルトの名無しさん2008/03/14(金) 12:19:27
>>382
それ動く?
0387デフォルトの名無しさん2008/03/14(金) 13:10:12
>>383
あー、xだけではダメだった場合が記憶にある
実際のNKF::nkfのオプション晒すがいいぞ
0388デフォルトの名無しさん2008/03/14(金) 13:27:17
$ nkf -xe imekao > kao
$ ./kao.rb < kao > cannakao
kao.rbはunixuserかどっかから持ってきた奴
#!/usr/bin/ruby -Ke
require 'kconv'

while line = gets

str = line.split(/\t/)

next unless str[2]
next unless str[2].toeuc.chop == "顔文字"

print str[0].toeuc
print " #KJ "
puts str[1].toeuc.gsub(/ /, "\\ ")

end
0389デフォルトの名無しさん2008/03/14(金) 13:45:46
…。

>>388
.toeuc は半角カタカナを全角に変換する
シェル上での処理の併用っぷりとかに疑問がありまくりだが、とりあえず、.toeucを外せ
kaoファイルの時点ですべてEUC-JPに変換されている(-xの効果で半角カタカナ維持中)から、kao.rbの内部でEUC-JPへ変換する必要はない
0390デフォルトの名無しさん2008/03/14(金) 14:04:58
>>389
シェル使うのはRubyが面倒だからです
まあなんにしろできましたありがとう
0391デフォルトの名無しさん2008/03/14(金) 19:22:15
Baseを上手く継承させたいんですが、ムリでしょうか?

class Base
def msg(s)
print s, "\n"
end
end

class A < Base
def show
self.msg('class A')
end
end

class B < Base
def B.show
self.msg('class B')
end
end

A.new.show
B.show
0392デフォルトの名無しさん2008/03/14(金) 19:26:27
数値オブジェクトにsmaller_thanとかlarger_thanみたいなメソッドないですか?
>とか<を使うと、オペランド間の優先順位が気になります
0393デフォルトの名無しさん2008/03/14(金) 19:30:12
>>392
素直に ( ) でくくれ
そっちのほうが文字数も短い
0394デフォルトの名無しさん2008/03/14(金) 19:30:47
1.<(3)
3.<(1)
0395デフォルトの名無しさん2008/03/14(金) 19:35:07
>>391
Base.newとすることが無いなら、BaseをmoduleにしてAとBでincludeすれ
眠いから不正確かもしれんがだいたいそんな感じ
0396デフォルトの名無しさん2008/03/14(金) 19:35:23
>>391
Baseのmsgはインスタンスメソッドなんだから、B.showの中でBaseのインスタンスがないとどうしようもないかと
0397デフォルトの名無しさん2008/03/14(金) 19:41:04
>>393-394
そういう書き方も出来たんですね
ありがとうございました
0398デフォルトの名無しさん2008/03/14(金) 19:48:01
>>395
やっぱりB.showで使えないみたいです…

module Base
def msg(s)
print s, "\n"
end
end

class A
include Base
def show
self.msg('class A')
end
end

class B
include Base
def B.show
self.msg('class B')
end
end

A.new.show
B.show

>>395
そうですよね…
継承する時に、特異形式での継承修飾とか出来れば解決するんですが…

やっぱり特異メソッドの中だけ、Baseのインスタンスを作って、Baseのメソッドを呼び出すしかないんでしょうか?
0399デフォルトの名無しさん2008/03/14(金) 20:01:36
A')

これが気になった('A')
0400デフォルトの名無しさん2008/03/14(金) 20:15:47
>>398
class B
 extend Base
 def B.show ; self.msg('class B') ; end
end
0401デフォルトの名無しさん2008/03/14(金) 20:30:25
>>398
継承元の msg() をクラスメソッドにしないのには、
何か理由があるのでしょうか?
04023982008/03/14(金) 21:15:32
>>400
解決しました!ありがとうございます!

>>401
既に使用しているスクリプトで
大量にメソッドを定義したBaseや、それを継承したAみたいなクラスがあったのですが
新たにインスタンス化して使うクラスを別途作成していて
そこでもBaseの機能を使用しなければならなくなって困ってました。
0403デフォルトの名無しさん2008/03/14(金) 21:52:44
なんか危ないねぇ・・・
0404デフォルトの名無しさん2008/03/14(金) 22:04:15
Ruby で書かれたウェブサーバー Mongrel の作者曰く「Ruby は低品質で、
ゴミクズソフトが頼っているクソみたいなインタプリタにも関わらず不当に勢いを得た」.
http://po3a.blogspot.com/2008/03/ruby-mongrel-ruby.html
0405デフォルトの名無しさん2008/03/14(金) 23:28:07
>>404
> エキスパートの意見を参考に死ぬまで Ruby を使わないと決心した。

あらまあ真に受けちゃってお気の毒に。

つ http://www.rubyist.net/~matz/20080114.html#p02
0406デフォルトの名無しさん2008/03/14(金) 23:31:21
もとからRubyが嫌いなんでしょ
その人なりのジョークだよ
0407デフォルトの名無しさん2008/03/14(金) 23:38:22
そのわりにはRubyに生活かけてる割合高いなー
0408デフォルトの名無しさん2008/03/15(土) 03:11:09
Web上で既にCSV形式になってるページをDBに突っ込みたいんだけど、
美しく記述するためにはどうすればいい?

#baz.cgiからidが10番から50番のデータを取り出す
#id,name,sex…など5カラムがCSVで返ってくる
open('http://hoge.foo.bar/baz.cgi?10&50') do |f|
 m = Mysql.new('localhost', 'hogeuser', 'hogehoge', 'hogetable')
  f.each do |line|
   sql = m.prepare('insert into name values(?, ?, ?, ?, ?)')
   sql.execute(line.split(',')[0], line.split(',')[1], line.split(',')[2], line.split(',')[3], line.split(',')[4])
 end
end


折角CSVで来てるのに、分割して挿入するのがどうも…。
0409デフォルトの名無しさん2008/03/15(土) 03:13:21
sql.execute(*line.split(','))

*がなければ、配列1つを1引数として
*を付けると、配列をその場に展開して書いたように
渡してくれる。
04104082008/03/15(土) 06:46:27
いろいろできるもんだね。
勉強がてら色々書いてるけど、何でも出来る分、メソッドとか覚えきれない…。
0411デフォルトの名無しさん2008/03/15(土) 11:52:02
>>408
>   f.each do |line|
>    sql = m.prepare('insert into name values(?, ?, ?, ?, ?)')
ループの中でprepareすんなよ。
0412デフォルトの名無しさん2008/03/15(土) 12:35:50
というか、コピペで頑張ってる時期でprepareのご利益についてまだ知らないんだろう
0413デフォルトの名無しさん2008/03/15(土) 12:38:19
splitを、結果保存しないで5回も呼んでる時点でそのへん突っ込んじゃいけないことが分かる。

0414デフォルトの名無しさん2008/03/15(土) 12:43:18
総力を挙げて突っこむのがこのスレの趣旨では・・・w?
0415デフォルトの名無しさん2008/03/15(土) 12:53:34
>>414
そんな趣旨はない

ただし、もし
 
csv = open('http://hoge.foo.bar/baz.cgi?10&50').readlines
m = Mysql.new('localhost', 'hogeuser', 'hogehoge', 'hogetable')
sql = m.prepare('insert into name values(?, ?, ?, ?, ?)')
csv.each do |line|
sql.execute(line.split(',')[0], line.split(',')[1], line.split(',')[2], line.split(',')[3], line.split(',')[4])
end

というコードだったらsplitの部分はm9(^Д^)プギャーされても文句言えない
0416デフォルトの名無しさん2008/03/15(土) 13:19:43
require 'csv'
csv = open('http://example.com/baz.cgi?10&50').read
m = Mysql.new('localhost', 'hogeuser', 'hogehoge', 'hogetable')
sql = m.prepare('insert into name values(?, ?, ?, ?, ?)')
CSV.parse(csv){|a| sql.execute(*a)}

読みやすさ維持しつつコンパクトに表現するとこんな感じ?
0417デフォルトの名無しさん2008/03/15(土) 13:37:06
それだけのことが書ける人はcloseするかブロック付きopenを使う、はず。
0418デフォルトの名無しさん2008/03/15(土) 13:52:14
ワンライナーでお願いします
0419デフォルトの名無しさん2008/03/15(土) 13:56:55
contents = File.open('hoge.txt'){|f| f.read}
というファイル読み込みの書き方は初学者の人に微妙に人気がない
0420デフォルトの名無しさん2008/03/15(土) 13:59:22
contents = IO.read('hoge.txt')
0421デフォルトの名無しさん2008/03/15(土) 14:01:55
>>419
contents = nil
File.open(path) do |f|
contents = f.read
end

たとえ4行に増えてもこっちのほうがわかりやすいんだろな
ブロックの最後に評価されたものが自動で返るという仕様に依存した書き方は気持ち悪いらしい
0422デフォルトの名無しさん2008/03/15(土) 14:02:10
File.readのほうが受けがよさそう。同じことだけど。
0423デフォルトの名無しさん2008/03/15(土) 14:11:13
IO.readってファイル読み終わったらクローズされてるの?
0424デフォルトの名無しさん2008/03/15(土) 14:11:19
よし、流れ理解
> ブロックの最後に評価されたものが自動で返るという仕様に依存した書き方は気持ち悪い
つまり、メソッドにおけるreturnのような明示的に値を返す意図を感じるものがあればいいんだな

contents = open(path){|f| break(f.read)}

これでどうだー
0425デフォルトの名無しさん2008/03/15(土) 14:13:45
うちの大学の助手が
fp = nil
fp = File.open(path, "r")
if(fp==nil)
(以下ry

って書いてた
早く何とかしないと・・・
0426デフォルトの名無しさん2008/03/15(土) 14:23:41
>>423
IO.readとFile.read(とforeachとreadlines)は特別

ただし、バイナリモードにしない(できない)んで、Windowsで使うときには注意、というか使ったらダメ子ちゃん
0427デフォルトの名無しさん2008/03/15(土) 14:25:33
http://doc.loveruby.net/refm/api/view/method/IO/s/read
1.9で拡張されたのかな。
0428デフォルトの名無しさん2008/03/15(土) 14:45:14
>>427
手元の1.8.6では動かね

IO#readとIO#foreachとIO#readlinesは俺スクリプト専用の便利メソッドとして割り切るしかないな
公開するスクリプトでは使えそうにない
0429デフォルトの名無しさん2008/03/15(土) 15:26:59
>>417
具体的にナニを close させる気なのか気になる
HTTP コネクションは OpenURI#open_http の中ですでに閉じてるし、
open 自体から返ってきてるのは StringIO だから close はただの読み書き禁止フラグだし

uri-open の open(uri){|sio| … } は「open(uri) の結果の StringIO をブロックに渡す」以上の意味はないように思う
カタチは同じだけれど、 open(local){|io| … } と open(uri){|sio| … } はやってることは違う
0430デフォルトの名無しさん2008/03/15(土) 15:53:18
>>429
> 具体的にナニを close させる気なのか気になる
Mysqlのコネクションとか?

> HTTP コネクションは OpenURI#open_http の中ですでに閉じてるし、
open-uriをrequireしてないじゃん。

> uri-open の open(uri){|sio| … } は「open(uri) の結果の StringIO をブロックに渡す」以上の意味はないように思う
> カタチは同じだけれど、 open(local){|io| … } と open(uri){|sio| … } はやってることは違う
URIからの読み込みと明示したいなら、URI.parse(...).readを薦める。
0431デフォルトの名無しさん2008/03/15(土) 15:57:45
>>425
> うちの大学の助手が
東大大学院の特任助手のことかー!?
0432デフォルトの名無しさん2008/03/15(土) 16:04:29
>>430
>>408読め
0433デフォルトの名無しさん2008/03/15(土) 16:11:38
open_httpの中で閉じているというのは実装詳細なので、
利用者としては期待してはいけないと思う。
0434デフォルトの名無しさん2008/03/15(土) 16:20:31
>>433
ブロックの終わりでcloseされるはずというのも実装依存だと思うぞ(ただのブロックであってもいいわけだし)
というか、件のは「closeされるべきものがそもそも無い」という話なんじゃ…

io = File.open(path)
ならIO.closeは「本来しなくてはならない」ものだけど、
sio = open(uri)
なら、StringIO.closeは「別にしなくてもいい」ものだろ
open(uri)でNet::HTTPが返ってきて適宜finishしなくてはならないというのは
それはそれで面白いことができそうだがぶっちゃけ面倒だ
0435デフォルトの名無しさん2008/03/15(土) 16:25:49
ブロック付きopenが閉じるってのは実装依存じゃなくて仕様じゃない?
0436デフォルトの名無しさん2008/03/15(土) 16:26:55
と思ったら、StringIOもしくはTempfileを返す、と仕様自体が再定義されるから問題ないのあ。
04374362008/03/15(土) 16:27:30
↑open-uriをrequireしたあとのKernel.openのことね。
0438デフォルトの名無しさん2008/03/15(土) 16:28:58
>>433
仮に閉じなくなったとしたら、OpenURI::MetaのcloseにHTTPセッション終了の機能を追加だな…
0439デフォルトの名無しさん2008/03/15(土) 16:37:12
>>436
そう
だから、open(uri)のブロックで、open(path)のように「ブロックの終わりで何かが閉じる」と考えるのは実は勘違い
eachに渡したブロックが終わるのと同じ

まあ、実際上はclose云々ではなく変数スコープとかの関係でブロックが重宝されてるんだけどさ
変に毛嫌いせんとブロック使っとけという感じではある

ただ>>421の気持ちはわかるけど
ブロックのendにメソッドチェーンがつくのと似たような感覚なんだろう
0440デフォルトの名無しさん2008/03/15(土) 16:41:28
>>408
O/Rマッパーを使う
0441デフォルトの名無しさん2008/03/15(土) 16:44:28
ずっと思ってたんだけど、

http = Net::HTTP.start('www.example.com', 80)

で開始されるhttpって、スクリプト内部の勝手な何かだよね?
外部へのHTTPコネクション自体は、http.getが実行された時点で開始して即終了してるんだよね?

ファイルIOみたく、http.finish(あるいはブロックの終わり)で終了しなくても対外的には問題ないよね?
0442デフォルトの名無しさん2008/03/15(土) 17:01:03
>>441
- 転送終了時、keep-aliveな場合はあえて@socketを閉じてない
- ブロック終わりに呼ばれるdo_finishでは@socketを明示的に閉じてる

ブロック使って自動でfinishしてもらったほうがいいと思うぞ
0443デフォルトの名無しさん2008/03/15(土) 18:12:40
>>416
標準のcsv.rbはでかいの食わせると思いっきり遅い

何度も大きなCSVを扱うならFasterCSVのほうがいいぞ
ファイル1個だけだから面倒なインストールなしで使える

データ構造やアルゴリズムが違うのか解析に手を抜いてるのかは知らん
0444デフォルトの名無しさん2008/03/15(土) 19:47:16
RubyってRAII的なものはないの?
Procとかじゃなくて
あるメソッドの先頭でマウスカーソルを砂時計にしてるんだけど、途中で抜けたり最後まで処理したりでいろんなとこにバラバラにカーソル元に戻す文書くのめんどいし忘れるんだ…
0445デフォルトの名無しさん2008/03/15(土) 20:40:45
Rubyには砂時計なんてねーよ

「今どのメソッドの"中"にいるかで値を変化させたい、むろん自動で」

というのは単にプログラムの設計が悪いだけだと思うぞ
0446デフォルトの名無しさん2008/03/15(土) 20:47:43
>>445
じゃあどういう設計がいいの?
0447デフォルトの名無しさん2008/03/15(土) 20:48:45
Ruby での RAII 的な者はイテレータじゃないのかな。
File.open とかそうだっしょ。
0448デフォルトの名無しさん2008/03/15(土) 20:49:33
>>444
def gui_wait
 カーソル変更(砂時計)
 yield
ensure
 カーソル戻す()
end

gui_wait { 処理 }
0449デフォルトの名無しさん2008/03/15(土) 20:52:18
もろ例になってるな。
http://ja.wikipedia.org/wiki/RAII#.E3.82.AF.E3.83.AD.E3.83.BC.E3.82.B8.E3.83.A3.E3.81.A8RAII
0450デフォルトの名無しさん2008/03/15(土) 20:57:37
しょこたんが「らいらいお(^ω^)」って言ってるのはこれの事だったのか
0451デフォルトの名無しさん2008/03/15(土) 21:07:38
うどんくいてー
0452デフォルトの名無しさん2008/03/15(土) 21:15:29
>>445
wxRuby使ってるんだ

>>447, 449
一応 Ruby RAIIでぐぐるとかはしてから聞いてるんだぜ…

>>448
ありがとう今だけ愛してる!
ensureって例外処理じゃねーとこでも使えたのかー

>>451
釜玉うどん最強
0453デフォルトの名無しさん2008/03/15(土) 21:21:41
>>452
おいおい。>>447>>449 と >>448 の言ってることは同じだぞw
0454デフォルトの名無しさん2008/03/15(土) 21:26:30
Ruby RAIIで今ぐぐったら一つめじゃねーか。
0455デフォルトの名無しさん2008/03/15(土) 21:29:20
>>453
ブロックに書くのと
def test
puts "test1"
return
ensure
puts "test2"
end
って書くのはちがくね?

Rubyist的にはどうかくのが定形なの?
別に毎回同じ処理だからブロックとかじゃなくて全然構わないんだけど…
0456デフォルトの名無しさん2008/03/15(土) 21:31:03
>>455
>>448 の最後の行を見る気もないようだな。
0457デフォルトの名無しさん2008/03/15(土) 21:39:38
あー、メソッド内でカーソル変えたり戻したりしないで汎用的なの1個使って使いまわせばいいじゃんってことか
0458デフォルトの名無しさん2008/03/15(土) 21:40:18
まぁWikipediaのRAIIのページに「ensureを使う」とまでは
説明してないから、ここで質問する意味はあったのであろう。
0459デフォルトの名無しさん2008/03/15(土) 21:43:03
ハッシュを多重代入する方法はありませんか?
ハッシュから複数の値を連続的に取り出す時、
ハッシュの名前を何度も書かないといけないのが気になります
0460デフォルトの名無しさん2008/03/15(土) 21:48:03
hash.values_at(key1, key2, ...)とすれば値の配列が得られる。

hash = { 'a' => 10, 'b' => 20, 'c' => 30, 'd' => 40, 'e' => 50 }
p hash.values_at('a', 'b')
p hash.values_at(*%w(a b))
0461デフォルトの名無しさん2008/03/15(土) 21:48:49
ん、多重代入する方法を知りたいのか連続的に取り出す方法が知りたいのか
どっちなんだ。
0462デフォルトの名無しさん2008/03/15(土) 21:53:39
long_name_hash = {'key1' => 'a', 'key2'=>'b', 'key3'=>'c'}
v1 = long_name_hash['key1']
v2 = long_name_hash['key2']
v3 = long_name_hash['key3']
p v1,v2,v3

を

(v1,v2,v3)=['key1','key2','key3'].map{|k| long_name_hash[k]}
p v1,v2,v3

と long_name_hash 1回で書けたら短けー!

とかそういう話にも見える
0463デフォルトの名無しさん2008/03/15(土) 21:57:26
「ハッシュを」じゃなくて「ハッシュから」か。
0464デフォルトの名無しさん2008/03/15(土) 21:58:41
tmp = long_name_hash
v1 = tmp['key1']
v2 = tmp['key2']
v3 = tmp['key3']
これで十分だと思うが。
0465デフォルトの名無しさん2008/03/15(土) 22:01:14
>>464
お前か、「書きやすいから」とか言う理由でhだのaだの短すぎてよくわからん変数バラ撒いてる張本人は
0466デフォルトの名無しさん2008/03/15(土) 22:07:32
tmp = foo.bar.hoge[baz].piyo

とかだとまあアリだろ。
変数名は状況が分からないとまともに付けらんないので適当。
0467デフォルトの名無しさん2008/03/15(土) 22:08:14
VBでいうwith的なものがほしくなるときはあるなー
0468デフォルトの名無しさん2008/03/15(土) 22:13:03
withってネストできるの?
0469デフォルトの名無しさん2008/03/15(土) 22:14:54
クラスやメソッドの名前は良く考えて決めるけど
ローカル変数の名前なんてどうでも良いや

と思ってるのはダメかな><;
0470デフォルトの名無しさん2008/03/15(土) 22:16:20
VBのwithってPascalといっしょだっけ?
Rubyならinstance_evalでいいんじゃね?
0471デフォルトの名無しさん2008/03/15(土) 22:24:11
他人に公開するんでなければ名前はどうでもいいんだけどね
引数は全部hやstr、返す配列はarr

ちょっとでもわかりやすい名前のほうがいいじゃんと考えるのはプログラマのいいとこ兼悪いとこだ
0472デフォルトの名無しさん2008/03/15(土) 22:26:22
仕事のプログラムは往々にして誰かに見られるんだがな。
0473デフォルトの名無しさん2008/03/15(土) 22:29:40
>>472
Rubyで仕事のプログラム書いてる人なんていないから大丈夫だよ!
0474デフォルトの名無しさん2008/03/16(日) 00:35:06
>>470
instance_evalはselfが変わるので、当然インスタンス変数やインスタンスメソッ
ドが使えなくなる。単なる一時変数の代わりに使うのはおすすめしない。
1.9ならtapというのがあるんだが。
0475デフォルトの名無しさん2008/03/16(日) 01:27:51
これくらいのなら1.9で実績作れば安定版にも入りそうだが

class Object
def tap
yield self
self
end
end

long_name_hash = {'key1' => 'a', 'key2'=>'b', 'key3'=>'c'}

long_name_hash.tap{|h| p h['key1']}
0476デフォルトの名無しさん2008/03/16(日) 01:41:59
tapの本当の使い道はメソッドチェーンの途中にくっつけることだな(tapping = 盗聴)
これがないなら単にselfをyieldするだけでいいわけで

class Object; def tap; yield(self); self; end; end
yyyymmdd = Time.now.tap{|t| p t}.strftime("%Y%m%d")
0477デフォルトの名無しさん2008/03/16(日) 01:43:23
タッピングって盗聴だったのか!
ピロピロだと思ってた・・・
0478デフォルトの名無しさん2008/03/16(日) 01:49:31
いや、ギターのタッピング(ライトハンド)はピロピロでいいだろ…
0479デフォルトの名無しさん2008/03/16(日) 02:01:29
>>475を見るとinject並にRubyプログラミングが変わる可能性があるなとか興奮したが
>>476を見るとそんなショボいメソッドいらねーよと思う不思議
0480デフォルトの名無しさん2008/03/16(日) 02:11:57
ActiveSupportにreturningというtapと形の似た定義のメソッドがある。
def returning(x)
yield x
x
end
selfじゃないところが違うな。

returning とりあえずの返値 do |x|
xをいじくる
end
みたいに使う。
0481デフォルトの名無しさん2008/03/16(日) 02:22:28
injectでRubyプログラミングが変わったなんて気はあんまりしないんだが…
微妙にわかりにくいのが初心者に広まらない原因かねえ。

result = 初期値
array.each do |e|
…
result = eとresultを足したり加工したりする
end

という処理はけっこう多いと思うんだけど。
0482デフォルトの名無しさん2008/03/16(日) 02:30:35
-ectシリーズの中でも比較的マイナーな動詞だからってのはあるかも。
と思ったら1.9で
* enum.c (Init_Enumerable): reduce is new alias to inject.
なのか。
0483デフォルトの名無しさん2008/03/16(日) 02:37:48
再帰処理をする時に、
関数やメソッドの名前を書かずにする方法はありますか?
関数名が変わっても、再帰部分は書き直さずにすむようにしたいです。
0484デフォルトの名無しさん2008/03/16(日) 02:38:41
すこし複雑な処理になるとeachではっきり書いたほうがわかりやすい

injectを使うと1行でまとまる、以上のメリットがあるとはあんま思えない
injectに5行くらいのdo〜endブロックがくっついてるのを見るとイライラする(w
0485デフォルトの名無しさん2008/03/16(日) 02:45:09
>>483
Yコンビ……いやなんでもない
0486デフォルトの名無しさん2008/03/16(日) 02:47:51
>>483
呼び出し部分をブロックで渡してyieldすればいいんじゃないの?
0487デフォルトの名無しさん2008/03/16(日) 02:48:02
関数とメソッドが違うという理解をしてもらえてるのは嬉しいが、
Rubyには関数がないんだよね
0488デフォルトの名無しさん2008/03/16(日) 02:50:32
実際の再帰処理をどう書いてるかによるよな
0489デフォルトの名無しさん2008/03/16(日) 18:49:46
>>483
質問の意味がいまいち理解できないがこんな感じか?
グローバル変数を使う上にスレッドセーフでもないが
def recursive_call(*param,&block)
 $recursive_block = block if block
 $recursive_block.call(*param)
end
# n から m までの合計値
a = recursive_call(1,10) {|n,m| n==m ? m : n+recursive_call(n+1,m) }
# 指定したディレクトリ以下の内容を表示
recursive_call('/tmp') {|path|
 puts path
 next unless File.directory?(path)
 Dir.new(path).each do |ent|
  recursive_call(File.join(path,ent)) unless ['.','..'].include?(ent)
 end
}
0490デフォルトの名無しさん2008/03/16(日) 20:35:13
>>483
先に断っとくと誉められたもんじゃない

def my_name
 str = caller[0].slice(/`.*?'\Z/) and str[1...-1]
end

とかをこさえて自分自身をsendなりで呼ぶ。
0491デフォルトの名無しさん2008/03/17(月) 00:14:55
Rubyでdefを変数に保存する場合って
どうすればいいのですか?

関数ポインタとか関数オブジェクトみたいな
ものがどれに該当するのか解らない
0492デフォルトの名無しさん2008/03/17(月) 00:22:31
Procとかlambdaとか
0493デフォルトの名無しさん2008/03/17(月) 00:22:50
>>491
できません

似たようなことならProcを使うことでできるけど、専用に書き下ろさないといけない
0494デフォルトの名無しさん2008/03/17(月) 00:22:59
func = Proc.new do |args|
do_something(args)
end

func.call(1000)
0495デフォルトの名無しさん2008/03/17(月) 00:26:30
Module#instance_methodとObject#methodは?
0496デフォルトの名無しさん2008/03/17(月) 00:27:16
いやいや、あるから。

#!/usr/bin/ruby

class Test
def initialize(value)
@value = value
end

def show
p @value
end
end

class App
def main
test = Test.new("hoge")
show = test.method(:show)
show.call
end
end

App.new.main
0497デフォルトの名無しさん2008/03/17(月) 00:33:08
>>491
リロードしたら答えがあがってたけど、せっかくだから晒す
def hello(name) ; puts "hello #{name}" ; end
m = method(:hello)
m.call('hoge')
0498デフォルトの名無しさん2008/03/17(月) 01:28:24
メソッドを繋げていって配列を得て、
その配列を、他のメソッドの引数にしなければならない時
(たとえば配列が表すTimeオブジェクトの生成)、
メソッドチェーンが途切れるのが嫌です。
メソッドチェーンに繋げて書く方法があれば教えて下さい
0499デフォルトの名無しさん2008/03/17(月) 01:31:22
メソッドチェーンが長過ぎると読みづらいから
適当な所で切れても別にいいんじゃない?
0500デフォルトの名無しさん2008/03/17(月) 01:35:04
class Object
 def apply(method)
  method.call(self)
 end
end

hoge.hige.hage.apply(foo.method(:bar))

あまりおすすめはしない。
0501デフォルトの名無しさん2008/03/17(月) 01:50:33
メソッドが起動してしまってる時点で、存在したオブジェクトの総数は変わらんからな
変数名という薄っぺらいラベルがくっついてるかくっついてないかの違いしかない
返り値オブジェクトの回収までの時間がミリ秒長くなることを気にしてるなら、そんなん気にしてたら禿げるぞ

>>475のtapを使えばたいていメソッドチェーンの中にいることはできるけどな
0502デフォルトの名無しさん2008/03/17(月) 01:50:40
>>499-500
ありがとうございます
やっぱり自然な形ではできないんですね
あきらめて普通にやります
0503デフォルトの名無しさん2008/03/17(月) 02:33:38
ruby インタープリタはFIFOから読み込むことはできないんでしょうか?

$ mkfifo fifo
$ echo 'puts "hello"' > fifo
$ ruby fifo
反応なし

↑これでPythonやPerlではできるのですが。
ruby 1.8.6 (2007-06-07 patch level 36) [i486-linux]
0504デフォルトの名無しさん2008/03/17(月) 02:35:44
今やってみたら普通にできたけど。
ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]
0505デフォルトの名無しさん2008/03/17(月) 03:36:08
グローバル変数なんだがね,これ,一度書き込んだら後参照しかできないようにする方法って無いのかすら.
やっぱそれやりたかったら,なんかクラスのインスタンス変数にしてatter_readerにするしかないんだろか.
0506デフォルトの名無しさん2008/03/17(月) 03:52:58
グローバルな定数をfreezeしたらどうだろう?
0507デフォルトの名無しさん2008/03/17(月) 03:54:16
む、代入は警告つきで出来ちゃうのか。
0508デフォルトの名無しさん2008/03/17(月) 04:12:14
特異クラスにすれば楽かな
05095032008/03/17(月) 05:27:37
>>504
UbuntuとFedora4で試したんですが、どちらでもだめでした。なぜでしょうね?
0510デフォルトの名無しさん2008/03/17(月) 09:41:55
trace_var(:$readonly){|x|
raise if @set
@set = true
}
$readonly = 0
p $readonly
$readonly = 1


@setのselfは何なんだろう
0511デフォルトの名無しさん2008/03/17(月) 10:50:13
p self
0512デフォルトの名無しさん2008/03/17(月) 12:18:53
>>505
2度代入しないようにプログラムを書く

いやマジで
0513デフォルトの名無しさん2008/03/17(月) 12:48:48
>>510
いや、単に代入がすんでからフックを仕込めば
いいんじゃないか。
0514デフォルトの名無しさん2008/03/17(月) 14:41:36
Rubyの定数は「参照先が固定の変数」だからなあ

irb> VAL = '1st'
irb> VAL = '2nd'
(irb):3: warning: already initialized constant VAL
irb> p VAL
"2nd"

irb> VAL2 = '1st'
irb> VAL2.replace('2nd') # 破壊的メソッドで内容だけすりかえるのは警告されない
irb> p VAL2
"2nd"
irb> VAL2.freeze
irb> p VAL2.frozen?
true
irb> p VAL2.__id__
538355018
irb> VAL2.replace('3rd')
TypeError: can't modify frozen string # freezeは自分が破壊的メソッドの影響を受けるのを防ぐだけ
irb> p VAL2
"2nd"
irb> VAL2 = '3rd'
(irb):13: warning: already initialized constant VAL2
irb> p VAL2 # 定数が指すオブジェクトそのものが切り替えられることを防ぐ機能はfreezeにはない
"3rd"
irb> p VAL2.__id__
538545180

まあ、実施は固定になってないんだけどさ
0515デフォルトの名無しさん2008/03/17(月) 23:23:38
フォームから受け取ったCGI.newの長さを調べて
EUC-JPコードに変換しながら配列に入れていきたいんですが
CGI.newの個数の調べ方はありますか?
CGI.new.length
ではできなかったので
初心者すぎる質問ですいませんが
ご教授お願いしますm(_ _)m
0516デフォルトの名無しさん2008/03/17(月) 23:32:10
>>515
個数は調べる必要はない

cgi = CGI.new としたcgiからどういう形でデータを取り出せるのかよく調べるといいぞ
0517デフォルトの名無しさん2008/03/17(月) 23:36:49
cgi=CGI.new
cgi.params.length
でハッシュにして個数調べられました。
もっと調べるべきでした申し訳ないです。
0518デフォルトの名無しさん2008/03/17(月) 23:46:25
要素数にこだわってんなあ
0519デフォルトの名無しさん2008/03/17(月) 23:54:56
添字でないとアクセスできない人はときどきいる
あと、Array.newの引数にはサイズが要るだろう、みたいな人
0520デフォルトの名無しさん2008/03/17(月) 23:59:58
>>519
おれ、もともとヌルいスクリプト書きだけど
その辺に慣れきってしまってEXCEL VBAにさえ戻れなくなった
0521デフォルトの名無しさん2008/03/18(火) 00:50:38
レガシVBって特にスクリプト系の別言語に馴染むと信じられんくらいめどい
てか、配列が型付きなだけで、実質*allocのラッパってのがなんとも……
0522デフォルトの名無しさん2008/03/18(火) 08:14:02
Emacsでコーディングしているんですが、
複数行のインデントがぐちゃぐちゃのコードを一発できれいに整形するコマンドってあるでしょうか?
0523デフォルトの名無しさん2008/03/18(火) 09:36:38
region選択して C-M-\ indent-region

EmacsのTutorialにはなかったっけ?
0524デフォルトの名無しさん2008/03/18(火) 11:18:48
下手にEmacsの基本操作だから無いかもしれない
たとえば、HTMLを扱うsgml-modeでも同じことができる

indent-region とか comment-region とか覚えとくと便利
0525デフォルトの名無しさん2008/03/18(火) 15:48:12
>>519
あれを Array と呼んで平気な感覚のほうがオカシイということにまず気づけ。
new 時にサイズを指定するほうが自然だと思う人をコケにするのはそのあとだ。
0526デフォルトの名無しさん2008/03/18(火) 16:13:14
>>525は>>515が要素数を何に使う気だったのか理解してないな
0527デフォルトの名無しさん2008/03/18(火) 16:22:19
「配列に入れていきたい」の「配列へ」の値のセットに使う気だったんだろ?(あるいは配列の生成)
for文で繰り返しの最後の値が決められないとかそんなとこだと想像

cgi.paramsから値を取り出すときではないと思われる
というかキーと勘違いしてたということは>>517の自己解決っぷりからしてあまりありえなさそうだ
0528デフォルトの名無しさん2008/03/18(火) 16:35:01
おまえらそんなことより gem で wirble インストールして irb に色つけようぜ
マシンスペックがしょぼいと irb の起動が一瞬遅れるようになるけど
rubygem 使うライブラリにはよくあることだから気にするな
0529デフォルトの名無しさん2008/03/18(火) 16:42:20
色が付くとどうなるの?
0530デフォルトの名無しさん2008/03/18(火) 16:55:32
カ
ラ
フ
ル
に
なります
0531デフォルトの名無しさん2008/03/18(火) 19:00:44
エディタの色わけは不要

って言う人がたまにいるけど、
普段スクリプト言語しか使わない人なんだろうなぁ・・・
と思ってしまう。
そういう人には構文チェックで5分かかるような世界を味わって欲しい
0532デフォルトの名無しさん2008/03/18(火) 19:22:58
grepやlessで色がつくわけではないから、とか不思議な論理の話をしてる人もいたな
ぜひ(g)vim使用でのviewコマンドとか試して頂きたく
0533デフォルトの名無しさん2008/03/18(火) 21:05:18
色付け頼り派だが、
パイプして読むときにVimはめんどいよ…
0534デフォルトの名無しさん2008/03/18(火) 21:44:27
wirbleには若干問題があって、
>> Rational(10, 10)
=> Rational10, 10
>> /(10|20)/
=> 1020
などと表示されてしまうぜ。

どう直せばいいんだか。
0535デフォルトの名無しさん2008/03/18(火) 22:32:12
>>534
when ':': state << :symbol
when '"': state << :string
when '#': state << :object
when /[a-z]/i
state << :keyword
repeat = true
when /[0-9-]/
state << :number
repeat = true
when '{': yield :open_hash, '{'
when '[': yield :open_array, '['
when ']': yield :close_array, ']'
when '}': yield :close_hash, '}'
when /\s/: yield :whitespace, c
when ',': yield :comma, ','
when '>'
yield :refers, '=>' if lc == '='
when '.'
yield :range, '..' if lc == '.'
when '='
# ignore these, they're used elsewhere
nil
else
# $stderr.puts "DEBUG: ignoring char #{c}"
end

ということで、 返り値に / や ( や ) や | が来たときの処理がない
作者さんはこれで困ってないのかなあ、とちょっと思う
0536デフォルトの名無しさん2008/03/18(火) 22:38:35
作者は実は使ってないとか
0537デフォルトの名無しさん2008/03/18(火) 23:00:43
初版リリースしたとたん急に意欲がなくなって放置してしまうのはよくある事w
0538デフォルトの名無しさん2008/03/18(火) 23:05:35
胸が痛い。
0539デフォルトの名無しさん2008/03/18(火) 23:07:49
ていうか、使ってみるとよくわかるんだが、「返り値」が「メソッドや記号」で色づけされてもイマイチ有り難味が薄いんだよな
本当に必要なのはプロンプト行を目立たせることか、あるいは p や puts の出力を明確に分けること
0540デフォルトの名無しさん2008/03/18(火) 23:12:40
括弧は
when '(': yield :open_paren, '('
when ')': yield :open_paren, ')'
などとして色定義を追加すればOK。
/は状態を追加しないといかんな。
when '/': state << :re
とか。

そのあとwhen :stringのトコをコピーしてそれっぽく真似ればなんとかなるか。


0541デフォルトの名無しさん2008/03/19(水) 03:52:31
tak関数の先生の前で色付きのemacsを開いていたら
最近の若い人はみんなそうだなぁ みたいなことを言われた
0542デフォルトの名無しさん2008/03/19(水) 10:55:05
色付けとかないからマッカーシー先生が見間違えるんだよ、って言ってやれ
0543デフォルトの名無しさん2008/03/19(水) 11:00:49
ruby で作られたWebアプリでソースが公開されていて共用サーバでも実用に耐えるものってありますか。
0544デフォルトの名無しさん2008/03/19(水) 11:18:55
tDiary とか?
0545デフォルトの名無しさん2008/03/19(水) 11:21:42
hikiとか?
0546デフォルトの名無しさん2008/03/19(水) 12:21:43
>>542
さすがに第1引数、第2引数、... を識別する色分けはないだろうw
0547デフォルトの名無しさん2008/03/19(水) 18:21:06
ActiveRecord 使ってみたら require するだけで2秒以上かかるとか何の嫌がらせ?
0548デフォルトの名無しさん2008/03/19(水) 22:03:40
>>547
ロードが終わってからも、
find_系みたいに初めて使うときに動的に定義されるメソッドとかあるぞ。
0549デフォルトの名無しさん2008/03/19(水) 23:55:12
今まで使い倒してきた家庭内DebianのRubyのバージョンが1.8.2だったことに気づいて愕然とした

ところで、1.8.6 feature をまとめたページってない?
0550デフォルトの名無しさん2008/03/21(金) 09:54:32
>>547

インスコしたgems数に比例してロードが重くなるのはいけてないよなぁ。
0551デフォルトの名無しさん2008/03/21(金) 10:52:26
そんなファイルが増えたときのこと気にして作ってるわけないじゃん
インストール時に毎回17MBのYAMLファイルをネットから取得してパースさせるようなシステムだぜ

※1: 取得しないオプションもあります
※2: 実際には1MB程度に圧縮されたファイルを取得します(http://gems.rubyforge.org/yaml.Z)
0552デフォルトの名無しさん2008/03/21(金) 11:12:50
ASもgemも使わないARっぽい奴ってねーの?
0553デフォルトの名無しさん2008/03/21(金) 11:59:14
>>551
そしてyamlのパースが激重なんだよなw
いやsyckはがんばってんだけどファイルサイズがでかすぎる。
0554デフォルトの名無しさん2008/03/21(金) 13:39:13
ブロック付きメソッドの中で再帰をするには、
メソッドの中で、ブロックの内容を引数化しないといけないと思うのですが
どうやればいいのでしょうか?
0555デフォルトの名無しさん2008/03/21(金) 13:44:09
def saiki(&block)
 saiki(block)
end
0556デフォルトの名無しさん2008/03/21(金) 13:44:50
間違えた

def saiki(&block)
 saiki(&block)
end
0557デフォルトの名無しさん2008/03/21(金) 13:52:00
なるほど&varで引き取れるんですね
ありがとうございました
0558デフォルトの名無しさん2008/03/21(金) 21:52:05
クラスメソッド呼ぶ時は、
Hoge:fuga
Hoge.fuga
のどちらでもいいですが、:だと定数の可能性もあるので、
わかりやすさのために.を使った方がいいのではないかと思うのですが、
よく見る例では:が多いようです。
どちらがいいですか?
0559デフォルトの名無しさん2008/03/21(金) 21:55:01
なにを見て::のほうが多かったか気になる
0560デフォルトの名無しさん2008/03/21(金) 21:56:27
うむ
0561デフォルトの名無しさん2008/03/21(金) 22:00:32
Array::newとかやらんだろう、別にやってもいいけど
0562デフォルトの名無しさん2008/03/21(金) 22:02:15
逆引きRubyとかです。
:ではなく::でした。
0563デフォルトの名無しさん2008/03/21(金) 22:19:14
AVIファイルって、どーやって見るんですか?
メディアプレイヤーがエラーみたいになります
0564デフォルトの名無しさん2008/03/21(金) 22:22:34
>>562
ttp://www.namaraii.com/rubytips/?%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8%A5%EA

> Dir::mkdir("/home/take/tmp")
> Dir::rmdir("/home/take/tmp")
> Dir.rmdir(delthem) rescue ""

うわほんとだ気色わっるー
てかwikiの悪いとこが思いっきり出た形だな


メソッドはインスタンスメソッドとかクラスメソッドとか関係なく . で接続するのが無難
0565デフォルトの名無しさん2008/03/22(土) 02:35:06
Stringで、正規表現を使わない単なる文字の置換てどうしたらいいですか?
0566デフォルトの名無しさん2008/03/22(土) 02:52:18
ぶっちゃけ "::" でクラスの特異メソッドを呼べるようになったのは
C++ では出来るしっていうぐらいの意味しかなかった気がするんで
receiver.method っていう一つの形だけ覚えておけばいいんじゃないかと。

たまたま receiver がクラスなだけじゃないかおおげさだなあ、と。
0567デフォルトの名無しさん2008/03/22(土) 03:06:35
>>563
ffdshowをインストール
0568デフォルトの名無しさん2008/03/22(土) 03:08:40
>>566
マニュアルだと#になってるのはなんで?
0569デフォルトの名無しさん2008/03/22(土) 03:09:04
>>>565
(g)subの第一引数を正規表現ではなく文字列で与える。
0570デフォルトの名無しさん2008/03/22(土) 03:10:45
実は3::to_sとかも出来るという
0571デフォルトの名無しさん2008/03/22(土) 03:11:22
>>568
Class.new = Classクラスのnew (ex Foo = Class.new)
Class#new = Classクラスのインスタンスメソッドnew(ex a = Array.new)
の区別をするためじゃない?
0572デフォルトの名無しさん2008/03/22(土) 03:11:46
>>569
!?
そういう事になってたんですか
正規表現エスケープ→正規表現オブジェクト生成→それをgsubに与える
とやるところでした
ありがとうございました
0573デフォルトの名無しさん2008/03/22(土) 03:16:47
>> 'hello, world.'.gsub('.', '!')
=> "hello, world!"
>> 'hello, world.'.gsub(/./, '!')
=> "!!!!!!!!!!!!!"

こんな感じだな。
0574デフォルトの名無しさん2008/03/22(土) 03:58:53
> ruby 1.7 feature: 1.6 以前は、pattern が文字列の場合、
> その文字列を正規表現にコンパイルしていました。
> 1.7 以降は、その文字列そのものがパターンになります。
ウサギ本で止まってる漏れは知らなかったんだぜ
原書はもうすぐ第三版も出るってのに
0575デフォルトの名無しさん2008/03/22(土) 04:09:52
第三版ってバージョンはどれなの?
05764082008/03/22(土) 04:26:15
いろいろご指摘頂いたので直してみました。実際の要件に沿って追加しています。
細かいところは仕組みが理解できていないので、これから勉強します。

require 'rubygems'
require 'open-uri'
require 'mysql'
require 'fastercsv'
require 'kconv'

csv = open('http://hogehogehoge/hoge.cgi?10&50').read
csv = csv.toutf8 #EUC→UTF8

m = Mysql.new('localhost', 'hogeuser', 'hogehoge', 'hogetable')
 m.query('truncate table hogetable')
 column = '?,'
 column = column * 5
 column.chop!
 sql = m.prepare("insert into hogetable values(" + column + ")")

FasterCSV.parse(csv) do |line|
 line.pop #末尾にゴミが入る仕様なので取り除く
 if line.nitems == 5 then #空データの存在する行は読まない
  sql.execute(*line)
 end
end
m.close


いくつかテーブルを読み込む要件があり、カラム幅は不定のため外出し出来るようにしてみました。(外からURL、テーブル、カラム数を指定する)
が、やはり不恰好になりました。美しく記述する方法はありますか?

0577デフォルトの名無しさん2008/03/22(土) 04:28:14
>>575
1.9対応らしいよ

ttp://www.pragprog.com/titles/ruby3
> This third edition maintains that tradition, and has been updated
> to reflect the new features of Ruby 1.9.

とはいえフラナガン+Matz本もあるんだよね
0578デフォルトの名無しさん2008/03/22(土) 04:34:13
>>577
もう1.9対応か。早いね。
しかし高いな・・・
0579デフォルトの名無しさん2008/03/22(土) 04:42:33
あー。これって日本語版だと言語編ライブラリ編と
2つに分かれてるのがいっぺんになってるのか
しかし900ページって分厚そうだな
0580デフォルトの名無しさん2008/03/22(土) 04:50:23
>>577
フラナガン+Matz本ってどういう本なの?
フラナガンってニュータイプの研究をしている人じゃないだろうし・・・
0581デフォルトの名無しさん2008/03/22(土) 13:45:00
>>580
ふつーにRubyの入門からメタプログラミングまで載ってる。
0582デフォルトの名無しさん2008/03/22(土) 13:51:59
1.8と1.9での違いも載ってる。
あと、各章の口絵がWhy the Lucky Stiff
0583デフォルトの名無しさん2008/03/22(土) 16:04:18
>>581
いや、そのジオン公国立特務機関の使途。
ニュータイプが発するサイコ・ウェーブと呼ばれる感応波、特殊な脳波の一種とミノフスキー技術とを組み合わせることにより、
「サイコミュ・システム」システムを運用しようという本。
これによって遠隔操作が可能になるため、SEやプログラマの人件費を抑えることが可能になるということです。
0584デフォルトの名無しさん2008/03/22(土) 16:15:35
寒
0585デフォルトの名無しさん2008/03/22(土) 18:46:28
>>576
外だし出来てる様には見えないんだけどな
とりあえず ARGV について調べれ
0586デフォルトの名無しさん2008/03/22(土) 21:21:32
Class::method の記法は歴史的なものでしょ。
初期は Class.method と記述できなかったんじゃなかったっけ?
0587デフォルトの名無しさん2008/03/22(土) 23:09:25
>>586
逆、というのが >>566 の主張。前は "::" は定数アクセスのため「だけ」のオペレータだった。……と思った。
0588デフォルトの名無しさん2008/03/23(日) 00:23:25
初め、オブジェクトの状態を整数値で
class Something
STATUS_NEW = 0
...
end
のように定義して用いることを考えました。

しかし、よく考えてみると0という値に意味は無いのだから、:STATUS_NEWのような
Symbolを使ってもよいと考えたのですが、こういう場合どちらの方が標準的な
やり方なのでしょうか?
0589デフォルトの名無しさん2008/03/23(日) 00:27:19
値に意味がなく名前そのものに意味があるならシンボルだな。
0590デフォルトの名無しさん2008/03/23(日) 01:16:13
実際に使われてるのは定数だけだけどな

意味上正しいんだから定数の代わりにシンボル使うぜ、というのはそれはそれで正しいけど面倒だ
0591デフォルトの名無しさん2008/03/23(日) 01:18:10
面倒か?
0592デフォルトの名無しさん2008/03/23(日) 01:35:24
クラス外部からユーザーが利用する値なのなら定数にしとかないとわけわからなくなる予感

自分が混乱しないんならどう書いてもいいんじゃね
俺は固定の値に定数とシンボルの2種類があったら混乱するけどさ
0593デフォルトの名無しさん2008/03/23(日) 03:07:49
良く読まないと質問の意図を取り違えるな
STATUS_NEW = 0 を STATUS_NEW = :STATUS_NEW にするって事か
で obj.status = :STATUS_NEW と書くのとどう違うんだ?
0594デフォルトの名無しさん2008/03/23(日) 03:20:37
てっきり
STATUS_NEW=0
obj.status = STATUS_NEW
がいいか
obj.status = :STATUS_NEW
がいいかという質問だと思ってた。
0595デフォルトの名無しさん2008/03/23(日) 03:22:17
>>588
bool 変数として使うのなら true にしたら?
0596デフォルトの名無しさん2008/03/23(日) 09:47:31
STATUS_NEW = 0
STATUS_OLD = 1

case obj.status
when STATUS_NEW
when STATUS_OLD
とかやるんだろ。。
0597デフォルトの名無しさん2008/03/23(日) 12:39:14
OSはXP、rubyのバージョンは1.8.6です。
エディタはSciTEです。
今日はgetsを勉強しようと思い
puts gets
とコードを入力してエディタからF5を押してプログラムを実行したところ
コマンドプロンプトが立ち上がりそこからカーソルは点滅しているのですが
文字が入力できなくなってしまいました。
Enterを押しても抜けれません。
おかしいなと思いコマンドプロンプトをスタートメニューから立ち上げて
ファイル指定したらプログラムを実行することはできました。

SciTEの方からF5で立ち上がるコマンドプロンプトに文字を入力させるにはどうしたらいいでしょうか。
よろしくお願いします。
0598デフォルトの名無しさん2008/03/23(日) 17:30:07
素朴な疑問なんですが、
rubyをC直下にインストールした後に環境変数を設定した覚えは無いのに
どこからでもrubyコマンドが使えるってのは何故ですか?
コマンドプロンプトはどうやってrubyを認識してるのでしょうか
0599デフォルトの名無しさん2008/03/23(日) 17:32:49
rubyをインストールしたときに勝手に環境変数設定してくれたんじゃないの?
0600デフォルトの名無しさん2008/03/23(日) 17:42:36
Rubyあんま関係ないな

Rubyのインストーラが「環境変数」の「Path」に c:\ruby\bin を追加してくれただけだろう
コマンド実行と環境変数の関係について調べてみるといいぞ
0601デフォルトの名無しさん2008/03/23(日) 17:45:29
今調べたら C:\PROGRA~1\Borland\Delphi6\Bin とか書いてあってちょっと泣いた
06025882008/03/23(日) 17:52:59
すいません、遅くなりました。
説明が足りませんでしたが、質問の意図としては>594さんの通りで
実際には状態を表すSTATUS_*が複数存在します。

定数でなければならない場合と、Symbolが理想的な場合があって、オブジェクトの
を使う開発者から見ると、両者を区別して考えることは無いように思います。
ですから両方の場合で定数を使うように統一したほうが、オブジェクトを使う側から
してみればSymbolを使うのか定数を使うのか覚える必要が無く楽である。

という結論を得たので、定数にすることにします。ありがとうございました。
0603デフォルトの名無しさん2008/03/23(日) 18:16:42
>>599
>>600
ありがとうございます
今調べてみたらPATHに c\ruby\binが追加されてました。
0604デフォルトの名無しさん2008/03/23(日) 18:44:20
Symbolだとtypoしたとき困りそう。
定数ならエラーになるよね?
0605デフォルトの名無しさん2008/03/23(日) 18:54:34
そんなこと怖がるな。
しっかりテストしる。
0606デフォルトの名無しさん2008/03/23(日) 18:56:35
RSpec
0607デフォルトの名無しさん2008/03/23(日) 20:32:59
どうしてrubyなの?
実績も何も無い言語ですよね
pythonじゃなくてrubyを使う理由を一つでもいいから教えてください
開発者が日本人だからですか???????
0608デフォルトの名無しさん2008/03/23(日) 20:37:39
>>604
send "handle_#{sym}"
なんて感じで分岐を振ればNoMethodErrorにしてもらえるぜ。
何事も実装しだい。
0609デフォルトの名無しさん2008/03/23(日) 20:38:18
>>607
ぐぐれ
0610デフォルトの名無しさん2008/03/23(日) 20:41:35
>>607
もうそろそろ日曜も終わるな
0611デフォルトの名無しさん2008/03/23(日) 20:42:23
>>607
Guidoはいじれないから
0612デフォルトの名無しさん2008/03/23(日) 20:48:08
TMailが使いにくいと感じたので、net/smtpやハッシュとか使ってメール作成&送信モジュールを作成

半年経ってわかりやすく改造しようと思い、メールのfromやtoもメールオブジェクトのメソッドにしていったら
TMailとたいして変わらないものができた

何やってんだ俺
0613デフォルトの名無しさん2008/03/23(日) 21:00:18
>>612
でも、その過程でいろいろ身についたんじゃない?
0614デフォルトの名無しさん2008/03/23(日) 21:12:21

どう考えてもめんどいからデータの格納はハッシュのキーと値でいいじゃん

から

使いにくいからクラス作って適当にアクセス用メソッド併用すればいいじゃん

に移行する期間というのはあるな
これの前後でスクリプトは全然違う
プログラム名のモジュール作ってその中に細かくクラス、という習慣ができた前後でもかなり違うけど
0615デフォルトの名無しさん2008/03/23(日) 21:16:48
オセロの中島知子と他2人(知らない人)と一緒に車で逃げているのだ。何から逃げてるかって?
核だよ。核。

どういうわけか、東京に核爆弾が投下されるという情報を知っていて、北へ向かって逃げているんだ。
それで、中島知子はパニクって反対車線へ行ったり来たりと、もう、てんやわんや。
で、暫く走ってると、車が沼地にハマっていて身動きが取れない。その時点で、もう東京じゃないんだけどさ。

すると、遠くの方がピカって光ったんだ。

次の瞬間、俺は食堂でトンカツを食べていた。

その味はやわらかくてジューシーで、こんな素晴らしいトンカツを食べられる私は、きっと特別な存在なのだと感じました。
今では、私が食堂の店主。客に出すのはもちろんトンカツ。
なぜなら、彼もまた、特別な存在だからです。
0616デフォルトの名無しさん2008/03/23(日) 21:29:27
ここまで明後日の方向の誤爆だと誤爆元が気になる
0617デフォルトの名無しさん2008/03/23(日) 22:06:16
こんな電波レスが受け入れられるスレってどこの板にあるんだ?
0618デフォルトの名無しさん2008/03/23(日) 22:09:44
"客に出すのはもちろんトンカツ" でぐぐれ
0619デフォルトの名無しさん2008/03/23(日) 22:09:46
>>611
ちょっ

微妙に本当くさくてイヤな理由だな
0620デフォルトの名無しさん2008/03/24(月) 07:55:30
>>612
RubyForgeに登録しる

プロジェクトの活発さ:0.00
0621デフォルトの名無しさん2008/03/24(月) 13:06:39
新規にゼロから作って公開して車輪がらごろするよりはTMailに関わったほうがいいな
TMailが流行らないのは何故だろう
0622デフォルトの名無しさん2008/03/24(月) 13:12:22
メールボックス触る機能を内包してることで微妙にわかりにくくなったのが敗因かと
TMailにメール送らせるだけのラッパーライブラリとか作ったらきっと一部に受ける

っていうか、Rubyの外部ライブラリとしてはわりとふつーに使われてるほうだと思うが…
0623デフォルトの名無しさん2008/03/24(月) 14:34:59
どうしてrubyなの?
実績も何も無い言語ですよね
pythonじゃなくてrubyを使う理由を一つでもいいから教えてください
開発者が日本人なのが誇らしいとか??????
0624デフォルトの名無しさん2008/03/24(月) 15:33:19
>>623
たまたま
0625デフォルトの名無しさん2008/03/24(月) 15:38:10
>>623
使う理由がわからないなら今のあなたには必要のないものです。
だからとりあえず忘れてもいいですよ。
また学びたくなったらお越しください。

最後に、そういう話題はム板よりもマ板の方がふさわしいです。
0626デフォルトの名無しさん2008/03/24(月) 16:03:23
コピペ交えて輪廻のように相手してくれると思う
面白ければだけど
0627デフォルトの名無しさん2008/03/24(月) 16:28:28
再帰という概念がよく分かりません…。
参考書も変な例えばかりです。
分かりやすく解説されているサイトとかありましたら教えていただけますでしょうか。
0628デフォルトの名無しさん2008/03/24(月) 16:32:45
再帰はフィボナッチ数列と累乗を表現するためだけに存在します
それ以上の意味はないので自分から学ぼうとせずにさっくり忘れてしまってOKです
0629デフォルトの名無しさん2008/03/24(月) 16:32:55
>>627
Rubyではこだわる必要ない概念のような気が。
0630デフォルトの名無しさん2008/03/24(月) 16:38:17
Rubyではeachかeach_with_indexがあればなんとかなるよね
極めて必要に迫られたときになって初めて勉強するといいぞ

まあ
「再帰も理解できてないなんて何のためにプログラミングしてるの?」
とか煽られがちなのは確かなんだけどさ
0631デフォルトの名無しさん2008/03/24(月) 16:46:20
参考書で変だと思う例えでも、いざ分かってみると、
この筆者も悩んだあげくにこの例えを選んだんだな、と思うことがある。
0632デフォルトの名無しさん2008/03/24(月) 16:48:13
>>631
お前、本当に初心者か?
0633デフォルトの名無しさん2008/03/24(月) 16:52:29
全方位に完全初心者な人間が初心者にアドバイスなんかできるわけないだろ常識的に考えて
スレに澱ん…いや溜まってる奴はマニュアルくらいはさくっと読んでる奴だぞ
「読んだけど使ってないしよーわからんなー」という分野が多い場合はその分野は初心者なわけだし
0634デフォルトの名無しさん2008/03/24(月) 16:54:51
627です。
ありがとうございます。
上司にもこのことは忘れろと言われたので、忘れますw
ありがとうございました
0635デフォルトの名無しさん2008/03/24(月) 16:56:59
>>627
忘れるって言ってるけど一応

よっぽど頭のいい人は別として
再帰はそう簡単に分かったり身に付いたりするものじゃないと思われ

どの参考書の例えがわからないのかにもよるけれど
ある程度時間を割けるのならThe Little Schemerでも読んでみては
Lisp/Schemeスレで質問すれば答えも返ってくると思うよ
0636デフォルトの名無しさん2008/03/24(月) 16:59:27
RubyではEnumerableとProcが理解できてればそれでいいよ
0637デフォルトの名無しさん2008/03/24(月) 17:10:55
使いこなすのはともかく概念的に「再帰」ってそんなに難しいか?
今は学校で数学的帰納法とか習わないの?
0638デフォルトの名無しさん2008/03/24(月) 17:17:31
再帰を使って効率が良いなら使うけど、そういうケースはあんまり無いような。
0639デフォルトの名無しさん2008/03/24(月) 17:22:05
>>637
数学的帰納法は再帰と関係ないだろ
0640デフォルトの名無しさん2008/03/24(月) 17:22:12
再帰を知ってて使えるかどうかと、実際に使うかどうかは別問題だわな。

それはともかく、>>637に同意。
概念としての再帰は全然難しくないよね。
0641デフォルトの名無しさん2008/03/24(月) 17:23:03
>>>637
いやだから、たとえば累乗だけ書けても意味ないだろ
日常に再帰を適用できる脳にならないと、再帰を理解したことにはならない
0642デフォルトの名無しさん2008/03/24(月) 17:29:55
> 日常に再帰を適用できる脳にならないと
?
0643デフォルトの名無しさん2008/03/24(月) 17:42:45
>>641
ループはユーザーが末尾再帰を使って表現してください、とかいう
投げっぱなしジャーマンな言語の経験があるとそういうのは早いな
06446352008/03/24(月) 17:47:26
>>637
数学的帰納法が出てくるのは高二からの基礎解析だと思ったけど
漏れは二年から文系選択したせいで基礎解析は一切やってないんだ

ただ再帰は漏れみたいなゆとりじゃなくても難しい概念だと思うけどな
評価や言葉の問題なのでこれ以上は主張しないけど
0645デフォルトの名無しさん2008/03/24(月) 17:51:43
配列の並び替えを列挙するとか、配列からn個の部分集合を列挙するとかは
再帰を使うと楽だよ。使わなくても書けるが。
1.9ならArray#permutationとcombinationがあるけどね。
0646デフォルトの名無しさん2008/03/24(月) 18:10:53
順列と組み合わせ?便利そうだ
0647デフォルトの名無しさん2008/03/24(月) 18:48:47
ディレクトリのトラバーサルとか再帰で書いて練習したな
PC-98でTurboPascalだったから何年前かな…
0648デフォルトの名無しさん2008/03/24(月) 20:00:54
再帰=漸化式
0649デフォルトの名無しさん2008/03/24(月) 20:35:12
Ruby2.0っていつごろ出ますか?
0650デフォルトの名無しさん2008/03/24(月) 20:40:43
5年以内?
0651デフォルトの名無しさん2008/03/24(月) 20:44:43
まあ年単位の時間がかかるのは間違いない
間違っても今年中に出たりはしないだろうな
0652デフォルトの名無しさん2008/03/24(月) 20:49:17
1.9 やめて 2.0 にします。とか。
0653デフォルトの名無しさん2008/03/24(月) 21:29:33
ネットからデータ持ってくる必要があるのでダウンローダーのようなもの作ってます

Web上のコンテンツひとつについて、

@uri
@last_modified
@etag
@status
@length
@header_response
@content

といった感じで総合的にいろんなデータを管理保管できるクラスとか既に誰か作ってたりしませんか?
0654デフォルトの名無しさん2008/03/24(月) 21:50:51
Mechanizeとか?
0655デフォルトの名無しさん2008/03/24(月) 21:55:40
>>653
open-uriとか?
ttp://doc.loveruby.net/refm/api/view/library/open=2duri
0656デフォルトの名無しさん2008/03/24(月) 21:58:59
>>653
open-uri を使って URI#open した返り値の文字列なら標準で使える
OpenURI::Meta で拡張されています云々というアレ
open(uri).read と書くとこの芸はできないので注意

require 'open-uri'
uri = URI.parse('http://pc11.2ch.net/test/read.cgi/tech/1203658291/l50')
html = uri.read({'User-Agent'=>'Monazilla/1.00'})

p html.base_uri.to_s
p html.last_modified
p html.meta
html.meta_add_field('Title','Ruby 初心者スレッド Part 18')
puts html.meta['title']


# 結果
"http://pc11.2ch.net/test/read.cgi/tech/1203658291/l50"
nil
{"vary"=>"Accept-Encoding", "connection"=>"close", "content-type"=>"text/html",
"date"=>"Mon, 24 Mar 2008 12:49:07 GMT",
"server"=>"Apache/2.0.59 (Unix) PHP/4.4.2 mod_ssl/2.0.59 OpenSSL/0.9.7e-p1", "transfer-encoding"=>"chunked"}
Ruby 初心者スレッド Part 18
0657デフォルトの名無しさん2008/03/24(月) 22:26:00
open-uriは器用な子

でも>>656みたいなのだとStringIOやTempfileにファイル内容を保持し続けてないといけない予感
PStoreに保存するとかいう場合でメタな情報だけでいいって時には取り回し面倒そうだ
0658デフォルトの名無しさん2008/03/24(月) 22:40:18
再帰って普通に使うけどな。
ポイント使ったことない俺が言うくらいだから相当だよ、きっと
0659デフォルトの名無しさん2008/03/24(月) 22:44:32
どういうときに?
0660デフォルトの名無しさん2008/03/24(月) 22:44:55
>>657
いや、StringIOなんだしPStoreにはそもそも残らないだろ
読み込んでもメタデータ無しの普通のStringが返ってくるだけだと思うぞ
0661デフォルトの名無しさん2008/03/24(月) 22:45:01
漏れは使わないなあ。
イテレータでこねこねしてるだけで大抵なんとかなるし。
06626582008/03/24(月) 22:48:50
文字列処理系が多いかな。
xmlパースしたりwikiみたいな入力で独自文法実装したり
0663デフォルトの名無しさん2008/03/24(月) 22:49:19
* 扱う構造が再帰してる(ファイルツリーを歩くとか)。
* 分割統治なアルゴリズム。
あたりだと自然に出番が来るんだけどね。

こーゆーのはライブラリの奥に埋もれてて自分で実装する機会も減ったからな。
0664デフォルトの名無しさん2008/03/24(月) 22:53:12
>>660
あ、ほんとだ
じゃあhtml.metaやhtml.base_uriなんかを明示的に取り出して保存しないと駄目だな
なんか微妙に面倒
0665デフォルトの名無しさん2008/03/25(火) 00:25:30
よくわからんのだが,Integerクラスのインスタンスに対して#to_fするとFloatクラスのインスタンスになるわけだよな
それってつまり以下のサンプルみたいなことやってるのかな.
class ABC
def cde
return CDE.new
end
end

class CDE < ABC
end

hoge = ABC.new
p hoge
hoge = hoge.cde
p hoge

ただひとつ疑問が残る.Integerクラスのインスタンスであるfooに#to_fするとobject_idも変わるし,
foo = foo.to_f
と書く必要も無いのにちゃんとFloatクラスのインスタンスになっている.これってどういう仕組み?
0666デフォルトの名無しさん2008/03/25(火) 00:35:11
>>665
Rubyでは数値関係のクラスは特別扱いされてるけどそのへんの話を聞きたい?
Rubyスクリプトが出てこない話にもなっちゃうけどそれでもいい?
Rubyでは数値を例に出されると非常に困ることが多いんだ

そういう話でないのなら、たとえば

class Integer
def to_f
# 引数をFloatに変換するFloatクラスのクラスメソッドに自分自身を渡す
Float.induced_from(self)
end
end

って書いてるだけだよんとかそういう話になってとっても簡単なんだけど
0667デフォルトの名無しさん2008/03/25(火) 00:40:54
rubyスクリプトと他のexeで標準入出力を介して文字列をやり取りしたいのですが、どうすればいいですか。
0668デフォルトの名無しさん2008/03/25(火) 00:52:36
>>667
$stdin というIOオブジェクトで標準入力から流れてくる文字列を受け取ることができる

C:>TYPE test.rb
text = $stdin.read
puts "#{text}が来ました"

C:>ECHO うんこ | ruby test.rb
うんこ
が来ました

改行を取り除くにはどうすればいいかとか、改行ごとに配列のように扱うにはどうすればいいかとかは
$stdinが属してるIOオブジェクトの解説読め
open('hoge.txt'){|f|
とか書くときの f と同じものだ
0669デフォルトの名無しさん2008/03/25(火) 00:52:45
>667
Windowsヘルプの「コマンドラインリファレンス」の「リダイレクト演算子」のところを
よーーーーっく読んで下さい

あとRubyリファレンスの``とかSTDINとかSTDOUTとか参照
0670デフォルトの名無しさん2008/03/25(火) 01:01:10
caseとwhenの間は字下げあった方がいいですか?
0671デフォルトの名無しさん2008/03/25(火) 01:07:20
>>670
EmacsのRuby編集モードでは

case str
when 'hoge' then puts 'hogeです'
when 'huga' then
puta 'hugaです'
when 'piyo'
puts 'piyoです'
else
raise 'Unknown Error'
end

となっとる
caseとwhenは対等だな
06726652008/03/25(火) 01:49:28
>>666
kwsk
0673デフォルトの名無しさん2008/03/25(火) 05:45:37
Rubyで組み立てたSQLをmysqlにパイプを使って渡したいのですが
どう書けばいいでしょうか?
0674デフォルトの名無しさん2008/03/25(火) 11:10:58
mysqlのほうに標準入力受け取って解釈する機能があれば普通にパイプで渡すだけだな

ただ、ふつーは、Rubyからmysqlに接続するライブラリがあるからそれを使う
0675デフォルトの名無しさん2008/03/25(火) 11:13:38
>>665
Rubyでは変数自身はオブジェクトではなく、オブジェ
クトにつけられた仇名に過ぎない。
0676デフォルトの名無しさん2008/03/25(火) 11:14:49
>>675
いやそれは今関係ないと思うぞ
06776672008/03/25(火) 20:28:05
すいません。言葉が大分足りませんでした。

AI同士で対戦する多人数のゲーム(トランプのような)を作ろうと思っています。
ディーラーの部分をRubyで実装してAIの部分は好きな言語で実装します。
ディーラーであるRubyとAI(複数ある)で通信をするわけですが、
ディーラー側からAI側にメッセージを送るときには
AI側は標準入力でメッセージを受け取って、
AI側からディーラーにメッセージを送るときはAI側は標準出力にメッセージを出すようにしたいです。
ディーラーの実装をするにはどうすればいいでしょうか。
0678デフォルトの名無しさん2008/03/25(火) 20:35:15
>>677
IO.popen
rubyスクリプトがAIプロセスを起動する形になるけど
06796672008/03/25(火) 20:55:26
素早い回答ありがとうございます。
これからじっくり調べてみます。


0680デフォルトの名無しさん2008/03/25(火) 22:53:33
Ruby以外の言語も学ぶといいということでGaucheの本を買ってきた
わくわく
0681デフォルトの名無しさん2008/03/25(火) 22:58:33
Gaucheって言語じゃなくて処理系じゃないの?
0682デフォルトの名無しさん2008/03/25(火) 23:02:55
それがわかる人はお布施以外の目的で本買ったりしないだろうな
0683デフォルトの名無しさん2008/03/25(火) 23:55:28
いつもgoshで起動するからGaucheとか言われてもピンとこない
0684デフォルトの名無しさん2008/03/26(水) 01:22:30
>>680
# ←についての簡易コメント

と

## 以下の行の機能について普通にコメント

と

###
### クラスとかの全体的にコメント
###

の使い分けをするようになると予測
=begin
=end
はEmacsだと微妙に使い勝手が悪い
0685デフォルトの名無しさん2008/03/26(水) 02:06:15
クラスを宣言するまえにクラス呼んだらエラーになるの???
なぜか通らない。

baz = Hoge.new #←エラー???

Class Hoge
def fuga
#Something
end
end
0686デフォルトの名無しさん2008/03/26(水) 02:18:54
>>685
ああ、俺もRuby知って最初にこれが引っかかった
なんだよ全文評価してから実行してるんじゃないのかよ、みたいな
0687デフォルトの名無しさん2008/03/26(水) 02:23:53
俺も
0688デフォルトの名無しさん2008/03/26(水) 02:28:07
BASICのように1行ずつ逐次実行してる結果のように見えるよね

ちなみに

baz = Hoge.new

BEGIN{
class Hoge
def fuga
#Something
end
end
}

とBEGINブロックでクラス定義全体を囲めば「後ろに回す」流儀でも動作するが、
こういうことにBEGIN使うというのはおおむねやってはイカン
0689デフォルトの名無しさん2008/03/26(水) 02:42:38
1. スクリプトを構文木とかバイトコードとかなんかそんなのにコンパイルする
2. そののち、コンパイルしたものをおもむろに実行する

ふつーの言語では1の時点でクラスやメソッドが定義されるから「クラスより先にメイン処理」という書き方でも動作するんだけど、
Rubyでは2の中で動的に定義されるから「知らない」クラスやメソッドや変数は参照できない

1の時点で静的に定義するように言語を作ることもできたんだろうけど、それやったらただのPerlだな
06906852008/03/26(水) 02:49:51
こんなに柔軟な言語なのにこれが仕様なのか!逆に驚き。

実際にコーディングすると部品化が進んであんまり気にならなくなるのかな?
0691デフォルトの名無しさん2008/03/26(水) 02:56:40
俺も謎だったが慣れちゃったな〜
0692デフォルトの名無しさん2008/03/26(水) 02:58:24
>>685
というか、Rubyでは(1ファイルで済む簡単スクリプトでは)いちばん下に "メイン処理" を書く

$!/usr/bin/ruby -Ke

class Main
…
end

class GetData
…
end

data = GetData.new.get
main = Main.new
puts main.parse(data)


こんな感じ
実行中にクラスの再定義とかできてしまうことのトレードオフですな
0693デフォルトの名無しさん2008/03/26(水) 02:59:20
if hoge
 class Foo
  def bar
   p 1
  end
 end
else
 class Foo
  def bar
   p 2
  end
 end
end

みたいなことができる今の仕様の方が柔軟だろう
0694デフォルトの名無しさん2008/03/26(水) 02:59:47
class自体は何度も定義をオープンし直せるから、

class Hoge; end # とりあえずClassインスタンスを定数として存在させる
baz = Hoge.new # newを呼べる

class Hoge # fugaを呼ぶ前にfooをおもむろに定義
def fuga
puts 'ふが'
end
end

baz.fuga

はOK

0695デフォルトの名無しさん2008/03/26(水) 03:01:23
×foo
○fuga

fooよりfugaだろ、と思って直し、後半をなおし忘れた
0696デフォルトの名無しさん2008/03/26(水) 03:09:24
>>694
いや、newを先に書きたいのではなく、それで言うとbaz.fugaもまとめて先頭に書いておきたいのだろ
そのほうが逐次実行する内容が最初に目に付いてわかりやすいから

クラスやメソッドが何してるのかわからんうちから実行のとこだけ見せられても困るなという感じではある
なお、しばらく書き慣れて行き着くところはこういう形

require '組み込みライブラリ'
require '自作汎用ライブラリ'
require 'Hogeアプリケーション用クラスをファイルに分割したもの'

HogeApprication.new

require を無視すれば、メイン処理が先頭に来て自由に書けるように見える
なんだかんだ言ってRuby使いも先頭にまとめて書くとわかりやすいなと思ってるわけで
0697デフォルトの名無しさん2008/03/26(水) 03:45:50
$PRELOAD とかそんな変数作って
そいつが真なら全部読み込んでから実行されるとかは無理なんかね
0698デフォルトの名無しさん2008/03/26(水) 03:51:15
>>697
いや今でも全部読み込んでからきちんと上から順々に実行されてるって
同じファイルに書いたクラス定義だけを先に実行して欲しいなら>>688のようにBEGINで囲め
0699デフォルトの名無しさん2008/03/26(水) 05:26:26
>>696
そして require する各ライブラリの末尾で

if $0 == __FILE__
  require 'test/unit'
  #以下ユニットテストが続く
  :
  :
end

とやればいいわけだな
0700デフォルトの名無しさん2008/03/26(水) 13:29:15
>>680
Rubyの次はやっぱりLisp系か
0701デフォルトの名無しさん2008/03/26(水) 13:37:49
コンセプト先行なオモシロ言語をあんまり最初のほうで選ぶと

「Rubyでやってたほうがいいような気がする」
「っていうかHaskellで何ができるんだ」

というのが頭に残って学習が進まないからな
新言語のつまみ食いに慣れるまでは、Rubyと同程度には即効の有り難味のある言語を選んだほうがいい
GaucheはLisp処理系の中ではかなり実利的だから好適
0702デフォルトの名無しさん2008/03/26(水) 14:44:02
if val = load_from_xxx then
puts "値は#{val}です"
else
raise 'xxxがnilを返したので何かエラーです'
end

という、
「右辺からnilが返ってくれば変数の中身も代入の返り値もnil」
というのを利用したif文の書き方は真っ当ですか?
0703デフォルトの名無しさん2008/03/26(水) 14:48:46
>>702

val = load_from_xxx
if val then
…

と書かないで条件のとこで代入してしまうってことね

ややテクニカル、でFA
書くときは楽だけど、読み解くときちょっと面倒
メソッドチェーンがごっそりついてたり括弧がやたらあったりするのは個人的に勘弁
0704デフォルトの名無しさん2008/03/26(水) 15:04:16
val = load_from_xxx or raise
0705デフォルトの名無しさん2008/03/26(水) 16:49:49
>>704
それ要件カケラも満たしてねえぞ
0706デフォルトの名無しさん2008/03/26(水) 17:01:22
...<a href="../xxxx/hoge0123_a.swf" target="_blank">.....................
....<a href="../xxxx/hoge0123_a.jpg" target="_blank">....................
...<a href="../xxxx/hoge0123_b.swf" target="_blank">....................
.....<a href="../xxxx/hoge0123_b.jpg" target="_blank">.....................

から、jpgファイルのパスだけを正規表現で抜き出したいです。
['../xxxx/hoge0123_a.jpg', '../xxxx/hoge0123_b.jpg'] ← こんなのが返って欲しい
aタグ以外の何か、行数とか隣の文字とかに依存して抜き出すことはできません。
aタグ全部抜き出してswfのだけ消す、ということも今回できません。
0707デフォルトの名無しさん2008/03/26(水) 17:06:11
ルビーってオブジェクト指向言語なのに
何でクラスを作らなくても
いきなり「puts "hello"」ってかけるんですか?
0708デフォルトの名無しさん2008/03/26(水) 17:10:13
>>705
val = load_from_xxx or raise 'xxxがnilを返したので何かエラーです'
puts "値は#{val}です"
0709デフォルトの名無しさん2008/03/26(水) 17:10:52
>>706
普通にやればいいだけのよーな気もするが…
うっかりmオプションつけて余計なとこまで地引網状態とかいうミスがありがちなので注意
改行跨ぐととたんに面倒になるぞ

>>707
利便性のために作られた関数的メソッドの存在が気になる場合は
Kernel.puts "hello" と書くといい
0710デフォルトの名無しさん2008/03/26(水) 17:19:52
hello.rbというファイルを作って
def message
 "hello"
end
と書いた場合
このmessageはどこのクラスに属しているんですか?
それともどのクラスにも属していない?
0711デフォルトの名無しさん2008/03/26(水) 17:35:17
>>710
自分でいろいろ試せよ
Rubyは壊れたりしないから

class Object
def message
'hello'
end
end

puts message

# 実行結果

hello

ということでObjectクラス(実際は>>709の言うようにKernelだったはず)
トップレベルでいちいちクラスとか考えてたらめんどくさいのでちょっとだけ特別扱いされている
0712デフォルトの名無しさん2008/03/26(水) 17:52:25
>711
・行頭の半角スペースは無視される
・連続した半角スペースは一つにまとめられる
0713デフォルトの名無しさん2008/03/26(水) 17:55:38
いろいろ試そうにも、そもそも
class Objectってのが、どこから出てきたのか分からんし
そういう発送がないんだけど
とりあえず「Kernel」に含まれるこちは分かりました。
ありがとう。
0714デフォルトの名無しさん2008/03/26(水) 17:57:05
属するクラスがどうこう、という話を振ったなら、
全てのクラスの親のObjectくらいは知ってると思われても仕方ないと思われ
0715デフォルトの名無しさん2008/03/26(水) 18:03:40
いや、Objectがすべてのクラスの親だとは知っていますよ。
ただ、どこにもクラスの定義をしてないので
Karnelに含まれるっていうのが思いつかなかっただけで。
0716デフォルトの名無しさん2008/03/26(水) 18:04:36
>>706
String#scan
07176532008/03/26(水) 19:41:39
結局、
uri.update
とするとuriの中の@uriを@uri.read(header)して
headerには@last_modifiedや@etagや@cookieを詰め込んだりするようにしました


で、クラスの名前は Mechanize2 とかでどうすかね

がっかり
世の中の再発明ってそんなもんだよね
0718デフォルトの名無しさん2008/03/26(水) 19:52:59
curl使えばいいのに
0719デフォルトの名無しさん2008/03/26(水) 19:59:43
>>717
Ruby標準ライブラリを駆使するぜ!
WEBrick::Cookie とか存在忘れられてて地味に便利だしな!

とか思ってたら Mechanize::Cookie でナチュラルに取り込まれてたりする
全く以って世の中そんなもんだ
0720デフォルトの名無しさん2008/03/26(水) 21:33:58
Ruby/DBIを使ってPostgreSQLにアクセスしようとしていますが、次のエラーが出てしまう状態です。

C:/ruby/lib/ruby/site_ruby/1.8/dbi.rb:368:in `load_driver': Could not load driver (no such file to load -- C:/ruby/lib/ruby/site_ruby/1.8/dbd/Pg) (DBI::InterfaceError)
from C:/ruby/lib/ruby/site_ruby/1.8/dbi.rb:233:in `_get_full_driver'
from C:/ruby/lib/ruby/site_ruby/1.8/dbi.rb:219:in `connect'
from t.rb:3

---------------------------------------------------
# t.rb
1 require 'dbi'
2
3 DBI.connect("DBI:Pg:practice:localhost", "postgres", "*******")

---------------------------------------------------
環境は次の通りです。

Windows XP SP2
Ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
PostgreSQL 8.3
postgres-pr 0.4.0
dbi-0.2.0 dbi,dbd_pg

---------------------------------------------------
site_ruby/1.8/DBD/Pg/Pg.rbは存在していますが、何故ドライバが読み込めないのかが分かりません。
誰か分かる方がいらっしゃれば教えていただけないでしょうか。
よろしくお願いします。
0721デフォルトの名無しさん2008/03/26(水) 22:49:38
$GEM_HOMEって具体的に何のためのディレクトリですか?
0722デフォルトの名無しさん2008/03/26(水) 23:15:02
>>721
実は新しいgemsでは無設定でも適当にrbconfig.rbから取得して適当に動くので悩まなくてよい場合が多い
rubygems.rbによれば、Rubyが(自力コンパイルではなく)パッケージとしてインストールされてるかどうかによって
「/usr/lib/ruby/gems/1.8」か「/usr/local/lib/ruby/gems/1.8」あたりになる模様
「$GEM_HOMEを環境変数に設定して…」という過去を引きずった解説は二度手間か余計なトラブルの火種になってる可能性がある
(まあ、/varや/optあたりに置きたいという需要は一定数あるんだろうけどさ)


def dir
@gem_home ||= nil
set_home(ENV['GEM_HOME'] || default_dir) unless @gem_home
@gem_home
end

def default_dir
if defined? RUBY_FRAMEWORK_VERSION
return File.join(File.dirname(Config::CONFIG["sitedir"]), "Gems")
else
File.join(Config::CONFIG['libdir'], 'ruby', 'gems', Config::CONFIG['ruby_version'])
end
end

0723デフォルトの名無しさん2008/03/27(木) 05:57:44
rubyスクリプトでもtclsh並みに
外部コマンドを自然に書きたいです。
system "foo|bar > baz" みたいにquoteしてると見辛くて。。。
0724デフォルトの名無しさん2008/03/27(木) 10:46:12
何らかの手段でクォートしないとそれこそ見辛いじゃないか
シェルに渡す部分と自前のクラスやメソッドが渾然としてるほうがめんどくさい
Shell.install_system_commandsが流行らない理由はそこだろ
0725デフォルトの名無しさん2008/03/27(木) 11:14:35
>>710
def whoami; p self; end
whoami

後はリファレンス読んで。
0726デフォルトの名無しさん2008/03/28(金) 01:03:36
>>723
%x{ foo|bar > baz }

リファレンスのリテラル - コマンド出力参照
0727デフォルトの名無しさん2008/03/28(金) 02:56:33
aaa = ["あああ","いいい","ううう","えええ","おおお"]
こういう配列があって、

”えええ”という文字が、配列の何番目に来ているかを返す方法ってありますでしょうか?
0728デフォルトの名無しさん2008/03/28(金) 03:00:50
>>727
aaa.index("えええ")
=> 3
0729デフォルトの名無しさん2008/03/28(金) 08:38:49
>>726
いやそれブレースでクオートしてるじゃん

tclshにはUnknownプロシージャという仕組みがあって、これはRubyで言うmethod_missing
これで、未定義のtclコマンドがあれば外部シェルに丸投げしてる
lsというメソッドが無かったらシェル上でlsというコマンドが有効かどうか試す
0730デフォルトの名無しさん2008/03/28(金) 09:48:34
愚痴なんだけど

class A
attr_reader :val
def start
@val = Array.new
val << 'hoge!'
end
def hage
# …
val << 'hage!'
end
end

こういうコード書かれるとわかりにくいので読むの苦手だ
@val << 'hoge!'
でいいじゃんよ
attr_reader という字面に引きずられてる俺が悪いのはわかってんだけどさあ
0731デフォルトの名無しさん2008/03/28(金) 09:59:23
クラスの内側からゲッター呼んだ記憶がないんだけど
そういうコードってなんかメリットあるのかな
0732デフォルトの名無しさん2008/03/28(金) 10:19:52
>>731
attr* の自動生成の場合は全くご利益はないよね
インスタンス変数の表記を使わなくて済むことくらいか

>>730の例が勘違いしてるのかどうかわからんが、その例だと
「startメソッド以外ではインスタンス変数形式を使わない」という自己ポリシーの人がいる

最初にインスタンス変数に設定するときだけ @val= を使って、
クラス内で値を参照したり追加したりするときは必ずvalというアクセサ経由

めっちゃわかりにくいんだが…
0733デフォルトの名無しさん2008/03/28(金) 11:09:43
Math モジュールは同じ定義のメソッドと
特異メソッドとの両方が定義されているので、
特異メソッドを呼び出して使う使い方と、
クラスにインクルードして使う使い方との両方ができます。

pi = Math.atan2(1, 1)*4;
include Math
pi2 = atan2(1, 1)*4


ってあるけど、要は…

module Math
def self.atan2
…
end
def atan2
…
end
end

みたいになってるって事??
07347332008/03/28(金) 11:18:51
あ〜 こういうのがあるのか。

module_function :atan2
0735デフォルトの名無しさん2008/03/28(金) 11:42:23
module M
def hoge(s) print s, "\n"; end
end

class B
include M
def moge(s) self.hoge(s); end
end

class A
extend M
def self.moge(s) self.hoge(s); end
end

B.new.moge('B')
A.moge('A')
#include M
M.hoge('M')

「include M」なしで、M.hogeが可能な方法ってある?
0736デフォルトの名無しさん2008/03/28(金) 12:47:03
>>735
>>734
0737デフォルトの名無しさん2008/03/28(金) 13:43:16
>>736
735の、各A, B classの、include, extend をした上で
「include M」なしでM.hogeって事だよ?
module Mに module_function :hoge ってやってもエラーになるけど?
0738デフォルトの名無しさん2008/03/28(金) 13:48:02
>>732
リファクタリングで言うところの「フィールドのカプセル化」じゃないのかな。
rubyでそれが有効かどうかは知らんけど。
0739デフォルトの名無しさん2008/03/28(金) 14:35:38
なるほど、フィールドのカプセル化の*つもり*で
> 最初にインスタンス変数に設定するときだけ @val= を使って、
> クラス内で値を参照したり追加したりするときは必ずvalというアクセサ経由
とかやってるのなら納得がいく
本当にそういう誤用なのかは実際のコードを見ないとわからないけど
0740デフォルトの名無しさん2008/03/28(金) 14:44:16
>>737
module M
def self.hoge(s) print s, "\n"; end
def hoge(s) M.hoge(s); end
end
というのはどう?
0741デフォルトの名無しさん2008/03/28(金) 14:47:26
>>732
ケント・ベックの言う Indirect Access パターン[IPB47,SBPP101] ですね。
当該クラスを継承してアクセッサをオーバーライドするときに威力を発揮
しますが、読みやすさとのトレードオフを考慮する必要があります。あと、
Java や Smalltalk と違い、メソッドコールの際に () や self を省略できる
Ruby では、同名の一時変数がアクセッサを遮蔽してしまう問題もあるため
要注意です。
0742デフォルトの名無しさん2008/03/28(金) 15:24:21
Ruby/SDLには塗りつぶし多角形を描く命令ってないんでしょうか?
0743デフォルトの名無しさん2008/03/28(金) 15:25:06
> 当該クラスを継承してアクセッサをオーバーライドするときに威力を発揮
うおーなんかすごい納得した

けどなんかテクニカルだね
0744デフォルトの名無しさん2008/03/28(金) 15:34:59
>>741
>Ruby では、同名の一時変数がアクセッサを遮蔽してしまう問題もあるため
これはまったよ
class Hoge
def title=(text) ; ... ; head.title = text ; end
def init(params) ; ... ; title = params[:title] ; end
end
なんて書くと、ローカル変数のtitleが作られてそれに代入される
self.title = ... て書かないといけない
0745デフォルトの名無しさん2008/03/28(金) 16:35:59
>>740
う〜む、結局そうやるしかないのか…
0746デフォルトの名無しさん2008/03/28(金) 16:45:59
>>745
というか、わざわざ module を使う時点でこんなのしかないぞ
0747デフォルトの名無しさん2008/03/28(金) 18:15:02
rubyに
JavaScriptで言うところの with(){} はありますか?
0748デフォルトの名無しさん2008/03/28(金) 18:27:12
>>747
JavaScriptはよく知らんが、ぐぐった限りでは instance_eval が近そう
0749デフォルトの名無しさん2008/03/28(金) 18:27:19
Javascriptのwithは使うな。Mozillaでも非推奨になってる。
07507472008/03/28(金) 18:53:45
>>748
>>749
情報ありがとうございます。

簡略化好きなRubyが
JavaScriptのWith()勝手なメソッドを実装していないのは意外ですね。
0751デフォルトの名無しさん2008/03/29(土) 12:25:10
Pascalにもあるwithってことで
matz的には相当昔に検討してそうだな
0752デフォルトの名無しさん2008/03/29(土) 12:42:22
with (x) do
with (y) do
end
end

とかするとどうなるの? 内側優先?
0753デフォルトの名無しさん2008/03/29(土) 13:14:07
withの外にもレシーバ無しで呼べるメソッドやら変数があるんだから
やるとしても、入れ子特有の問題はないと思う(つまり内側から探索)

ローカル変数なのかメソッド呼び出しなのか、スコープが錯綜しすぎて暗黙の絞込みが出てくるとか
その辺の経緯はぐぐったらMLが出てくるはず

ところで、with文がある言語では、文内ではプロパティの操作のみに束縛するの?
0754デフォルトの名無しさん2008/03/29(土) 14:03:39
そいや、instance_evalのなかで当然selfが変わってるのに気づかずに
テストが通らなくて悩んだことがあったな。
0755デフォルトの名無しさん2008/03/29(土) 14:20:44
class Hoge
def self.moge
print "Hoge::moge\n"
end
end

Hoge::moge
Hoge.moge

↑の呼び出しの"."と"::"は同じ意味なんですか?
0756デフォルトの名無しさん2008/03/29(土) 14:25:46
>>755
このスレの>>558あたりからしばらくその話題
0757デフォルトの名無しさん2008/03/29(土) 14:33:36
>>756
やっぱり、同じだったんですね。

あとついでにもう一つ。
以下のコードだと's'を指定した場合は、正規表現で上手くマッチ出来ません。
's'の場合はS-JISですよね?だから日本語も処理出来る様になると思ったんですが…
$KCODE = 's' #こっちはダメ
#$KCODE = 'e' #こっちだとOK
if 'abcあいう'[/\W/] then print "error!\n"; end
07587572008/03/29(土) 14:38:02
あと、編集してるソースコードは、S-JISなんですけどね。
0759デフォルトの名無しさん2008/03/29(土) 14:39:13
ruby -Ks 757.rb
でどうよ?
07607572008/03/29(土) 14:45:42
>>759
それは、
$KCODE = 'ks'
でもいいんですよね?
確かにこうすれば正規表現マッチしますね。

あとついでに、以下の'jcode'をrewuireして
マルチバイト文字の置き換えなんかをする時
今度は、$KCODE='ks'では置き換え出来ず
$KCODE='s'にする必要があるのですが
正規表現で、/\W/をマッチさせ、且つ
trのマルチバイト文字置き換えを両立させるには
以下みたいにするしかないのでしょうか?

require 'jcode'

$KCODE = 's'
s = '012345'
print s.tr('0-9', '0-9')
$KCODE = 'ks'

if 'abcあいう'[/\W/] then print "\nerror!\n"; end
0761デフォルトの名無しさん2008/03/29(土) 15:06:21
$KCODEに設定する値に ks なんてのはない。(nと同等だろう)

$KCODEへの値の設定が行われるタイミングでは既にスクリプト
が構文ツリーへ変換されたあと。スクリプト自体が書かれている
文字コードは変換前に判明している必要があるから、スクリプト
の中ではなく、起動オプションで指定するの。
0762デフォルトの名無しさん2008/03/29(土) 15:09:45
$KCODEは先頭の1文字しか読まない
$KCODE='s'
と
$KCODE='SEXフレンドになってくれる人妻募集!'
は同じように扱われる

ruby 起動時の引数の -Ks は $KCODE 以上の意味を持つ
-Ks を指定すれば $KCODEは自動的に "SJIS" に設定されるから指定する必要はない

あと、マルチバイト対応させた正規表現の \w はマルチバイト文字を含むから
それを反転させた \W はアルファベットでも漢字でもひらがなカタカナでもない何か を表す
07637572008/03/29(土) 15:13:07
> $KCODEに設定する値に ks なんてのはない。(nと同等だろう)
なるほど。
しかしなんでまた、ヘルプに漢字を処理しない'n'でマルチバイトの正規表現が出来て
S-JISの's'がマッチ出来ないのでしょうか?
07647572008/03/29(土) 15:17:53
>>762
ああ、だから'n'でなければダメだったのですか。

あと、ウェブ上を色々見てると'jcode'は
色々と広範囲に渡って影響が出るので
なるべく使用しないほうが良いみたいな説明があったのですが
やはりあまり使用しない方がよいでしょうか?
07657572008/03/29(土) 15:22:57
それと結局 -Ksや$KCODE='s'でマルチバイト対応させた場合
正規表現で、英数('_'含む)以外文字があるのを発見するにはどう記述すればいいのでしょうか?
/\W/ ←これは使えないので…

質問ばかりで申し訳ないです。
0766デフォルトの名無しさん2008/03/29(土) 15:33:25
/[^0-9A-Za-z_]/
07677572008/03/29(土) 15:47:35
>>766
う〜ん、[]文字クラス中に'^'があった場合は、それ以外って意味になるんですねぇ…
Rubyのヘルプの正規表現の項に、説明が無かったので分かりませんでした…
ありがとうございました!
0768デフォルトの名無しさん2008/03/29(土) 16:21:40
rubyとrailsのapiを探してるのですが、どちらも個人が作ったような怪しいサイトしか見つかりません
実際に開発されてる方がよく見ているapiのサイトなどがありましたら教えてください
0769デフォルトの名無しさん2008/03/29(土) 16:28:50
gem serverが起動してあるので
http://localhost:8808/

できないなら
http://api.rubyonrails.org/
があるだろ。
0770デフォルトの名無しさん2008/03/29(土) 16:32:14
あ、Ruby自体はターミナルからri(or fri)。

0771デフォルトの名無しさん2008/03/29(土) 17:00:34
>>769
>>770
ありがとうございます。
難しそうですね。じっくり読んでみます
0772デフォルトの名無しさん2008/03/29(土) 17:09:45
Windowsだとヘルプファイルになってるのがあったよーな。
0773デフォルトの名無しさん2008/03/29(土) 17:20:21
ファイル・クラス・メソッド・本文の4ペイン式のって微妙に見づらいというか把握しづらいんだよね
もーちょい有機的に繋がる表現法があるといいんだけど
0774デフォルトの名無しさん2008/03/29(土) 17:23:39
個人サイトだけどapi.rails2u.comの使ってる人は結構いるんじゃない?

0775デフォルトの名無しさん2008/03/30(日) 00:36:57
Railsのapp/modelsにあるファイルに
validates_presence_of とか validates_format_ofってメソッド?を記述しますよね
引数として、
validates_presence_of :title :description
のような書き方をしますが、どうしてシンボルにする必要があるのでしょうか?
0776デフォルトの名無しさん2008/03/30(日) 00:50:18
>>775
validates_presence_of 'title'
のように文字列ではいけないのか? という質問なら文字列でいい。

validates_presence_of title
のようにアクセサメソッドではいけないのか? という質問なら、駄目。
validates_xxx を記述している位置にアクセサメソッドを書いても、
ここではselfはモデルクラス自体であってモデルのインスタンスではない。
それに、validates_xxxは検証処理を登録するクラスメソッドであって
それ自体がインスタンスに対して検証を行うわけではない。

あと、こんなスレもあるよ。
Ruby on Rails
http://pc11.2ch.net/test/read.cgi/tech/1191381506/
07777752008/03/30(日) 01:00:30
>>776
丁寧にありがとうございます!
しかし全く理解できません。馬鹿ですいません。
勉強し直して来ます!
0778デフォルトの名無しさん2008/03/30(日) 01:10:17
>>777
validates_presence_of というのが何かよくわからんが、
titleと書いてしまったらtitleメソッドの返り値に実際に入ってる文字列とかnilとか
そういうのそのものが評価されてしまうではないか


「titleという変数だかなんだかをチェックしてもらいたい」場合は、
引数に 'title' や :title という書き方をするのが普通
0779デフォルトの名無しさん2008/03/30(日) 06:31:18
メソッドの可視性を無視しprivateなメソッドを実行する目的でinstance_evalが
使われる様ですが、privateにしてあるメソッドをわざわざ外部から呼び出す
というのは、C++を使用したことのある私にとって、とても違和感があります。

どの様な場合にこのような呼び出しが用いられているのでしょうか?
0780デフォルトの名無しさん2008/03/30(日) 06:48:40
>>779
設計意図が理解できない人間がアクセスしようとした時じゃないか?
0781デフォルトの名無しさん2008/03/30(日) 10:59:51
でばっぐよう
0782デフォルトの名無しさん2008/03/30(日) 11:17:49
てゆーか、Rubyを常用してる人間からしても「こんなこともあろうかと」という奥の手的な処理だぞ

どうしても呼び出したい値(メソッド)があるから
「(ファイル○○のxxx行目に)この文字列がスクリプトとして書いてある」
ことにして実行させるというだけだ
privateを無視するために存在する記法ってわけじゃない

CやC++やJavaだけしか知らないのなら、evalという概念について調べてみるといい
0783デフォルトの名無しさん2008/03/30(日) 11:54:19
>>779
インタフェース以外に、実装のテスト書くときとかさ。1.9より前だとsendの第二引数でprivateなの呼べるけど。
どうしてもそのオジブェクトのコンテキストで実行したいなにかがある時に使うもんだと思う。

>>782
instance_evalはブロック渡せる。
0784デフォルトの名無しさん2008/03/30(日) 12:05:48
説明が不完全な場合も多いよね
「もちろん instance_eval を使えばメソッドを実行することはできます」
というような書き方にしとけば勘違いも減るんじゃないかと思う
0785デフォルトの名無しさん2008/03/30(日) 12:14:07
>>551
http://blog.segment7.net/articles/2008/03/29/rubygems-1-1-0
インデックス更新が速くなったとかなんとか書いてあるが、どんなもんだろ。


0786デフォルトの名無しさん2008/03/30(日) 13:49:55
$ gem -v
1.0.1
$ su -
# gem install --local rubygems-update-1.1.0.gem
Successfully installed rubygems-update-1.1.0
1 gem installed
# exit
$ gem -v
1.0.1

あれー?
0787デフォルトの名無しさん2008/03/30(日) 13:59:49
説明しよう!

rubygems 本体のアップデートは rubugems-update をインストールしただけでは駄目で、
別途 /usr/local/bin/ とかにある update_rubygems を自力で実行しないと駄目なのだ!

なんでこんな二段構えになってるのかは不明
っていうか>>785のページにもアップデート方法としてきちんと書いてあるじゃん
0788デフォルトの名無しさん2008/03/30(日) 14:05:38
書いてあるけど、
gem update --system
が最近のやり方だな。
0789デフォルトの名無しさん2008/03/30(日) 15:32:22
>>787
をを
っていうかよく読め俺

> Mem: 126432k total, 123756k used, 2676k free, 156k buffers
> Swap: 361420k total, 175772k used, 185648k free, 3232k cached

とかあっさりスワップに食い込んでHDDがガリガリ言ってるが、
30分程度で gem install --remote hoge は完了するようになった
最初のパース10分、本体インストール一瞬、riとrdocインストール5分、後処理15分
これまでは10時間単位でハングアップ状態だったからたいした進歩だ

>>788
YAMLをパースさせると死ぬのでこの場合は無理だったということで
今度からは使えそうなのでそれ使う
0790デフォルトの名無しさん2008/03/30(日) 16:25:43
いちソフトウェアのライブラリのアップデーターやインストーラーがメモリ128MB使い切るって邪悪だな
0791デフォルトの名無しさん2008/03/30(日) 16:35:25
獅子は兎を狩るのにも全力を尽くすの理
0792デフォルトの名無しさん2008/03/30(日) 16:41:31
>>790
rubygemsメイン開発者層の人は対処したいと感じるほど困ってないんだろうか

困ってないんだろうな
あるいは英語圏OSでは問題発生しないとかさー
0793デフォルトの名無しさん2008/03/30(日) 16:43:17
牛刀で鶏をなんたらの間違いじゃないか

XMLをDOMにパースしたらとんでもなくメモリ使うけど
YAMLもそういうクチ? SAXみたいなインタフェースないのかな
0794デフォルトの名無しさん2008/03/30(日) 17:02:16
YAMLはオンメモリでハッシュを生成するんじゃなかったっけ?
17MBのYAMLで表現されるハッシュ(実サイズがどれくらいになるのか不明)がメモリにどかーんと居座って
その中からがりごりと目的のキーを捜すとか、そんなわかりやすいがゆえに大味な処理になってると予測

でも 1.1.0 はMarshal併用したのがやっと正式に入ったからそれなりにメモリ消費が少なくてそれなりに速いはず
ttp://blog.segment7.net/articles/2007/10/05/rubygems-beta-approaching
> a new Marshal formatted index that will reduce both bandwidth usage and memory consumption.
> Instead of 120M or so it takes to do a bulk yaml index update, it takes about 30M with a Marshal index update
0795デフォルトの名無しさん2008/03/30(日) 17:10:20
それ 0.9.5 だから、これまで主流の 1.0.1 にはすでに反映されてる
0796デフォルトの名無しさん2008/03/30(日) 17:32:17
windows-xp環境でRubyを使っています。
ruby 1.8.5 (2006-12-25 patchlevel 12)

Cursesを使ってみたいと思い
"http://jarp.does.notwork.org/win32/"から「pdcurses-2.60-1-mswin32.zip」および「zlib-1.1.4-1-mswin32.zip」をダウンロードして
解凍された「bin」フォルダのpdcurses.dll、zlib.dllをrubyのインストール先の「bin」フォルダにコピーしました。

require "curses"としたところ
no such file to load -- curses とエラーがでます。

curses 拡張ライブラリを入れるにはどうしたらよいかよろしくお願いします。
07977792008/03/30(日) 18:11:59
遅くなりましたが、レス有り難うございます。
私のinstance_evalに対する認識がずれている様なので、再度調べてみます。
有難うございました。
0798デフォルトの名無しさん2008/03/30(日) 18:15:15
mswin32版バイナリをインストールすればcurses関連は標準で入ってないか?

でもこれ自分で入れたのかもしれんなあ。覚えてないや。
curses.so というファイルがrubyインストールフォルダのどこか
(たぶん、lib\ruby\1.8\i386-mswin32)に入ってなければ、そもそもcurses対応になってない
0799デフォルトの名無しさん2008/03/30(日) 19:15:18
>>796
つttp://www.garbagecollect.jp/ruby/mswin32/ja/documents/install.html

意外と気付きにくいんだよね、このページ
0800デフォルトの名無しさん2008/03/30(日) 20:05:43
ActiveScriptRuby には curses.so が入ってなくて動かなかった
mswin32版ダウンロードして curses.so だけコピーしたら動いた
0801デフォルトの名無しさん2008/03/30(日) 20:38:43
下手にASRをインストールするよりmswin32版を普通に展開したところに
RScript18.dllなどをコピーしてregsvr32したほうが色々面倒が無くて良い気がする。
0802デフォルトの名無しさん2008/03/30(日) 21:20:42
シンボルの概念がどうしても理解出来ません
ある時は変数になったり
ハッシュのキーになったり
メソッド名になったり

javaしか分からない私にどなたかjava的なヒントをください…
0803デフォルトの名無しさん2008/03/30(日) 21:26:57
Lisp/Schemeをちょっとだけかじるといいと思います
0804デフォルトの名無しさん2008/03/30(日) 21:37:16
識別子
0805デフォルトの名無しさん2008/03/30(日) 21:53:28
>>802
よく分からないうちは「生成がとても軽い文字列」なんだと思えばいい

ただし、端末や画面に表示するときには使わない
あくまでスクリプト内部で文字列的なものが必要なときに使う
0806デフォルトの名無しさん2008/03/30(日) 22:40:59
>>802
自動生成されるenumだと思えばおk
…あ、Javaにはなかったか。

「internされた文字列」でググれ。
0807デフォルトの名無しさん2008/03/30(日) 23:40:26
>806
enumはJava5以降あるにゃあるが、いろいろと奇天烈なので
あまし例えにつかわんほーが。
0808デフォルトの名無しさん2008/03/31(月) 00:56:08
優しいRailsの育て方、だと
SymbolはJavaのString, StringはJavaのStringBuilderって書いてあったな。

Rubyでは(JavaやPythonなんかと違って)文字列はMutableで、
シンボルはImmutable。つまり
> (a = "hoge").object_id
=> -605795638
> a.replace("fuga").object_id
=> -605795638 # 変わってない

> (b = :hoge).object_id
=> 164978
> (b = :fuga).object_id
=> 165058
てなもん。まあ、シンボルは整数の代わりと思うといいよ。
0809デフォルトの名無しさん2008/03/31(月) 00:56:49
>>802
名札オブジェクト

いや、そういう理解で困るような使い方はそうそう無いと思う
変数「の名前」やメソッド「の名前」を指すときに使う
0810デフォルトの名無しさん2008/03/31(月) 00:59:26
やっぱりlisp系やってない人向けの説明ってどーもすっきりせんよね。

0811デフォルトの名無しさん2008/03/31(月) 01:51:23
>>810
でも一度シンボルの存在を知ると「なんで××にはシンボルが存在せーへんのやー!!」とちゃぶ台返ししたくなる罠。
# Java も intern() があるくらいなんだから、組み込みのシンボル用意してくれればいいのに。
0812デフォルトの名無しさん2008/03/31(月) 14:32:01
でも下手に説明して同意をもらうと公開メソッドの引数のハッシュのキーが全部Symbol限定に…
もちろん「Stringをキーにするのは不自然」とか言いだすから変換措置なし
0813デフォルトの名無しさん2008/03/31(月) 15:22:15
Rubyist Magazine - cgi.rb がイケてない 12 の理由
ttp://jp.rubyist.net/magazine/?0023-Cgirb
0814デフォルトの名無しさん2008/03/31(月) 16:40:56
# ネストしたハッシュの一番奥のvalueを配列にする
arr = []
h.each_key do |k|
h[k].each_key do |name|
arr << h[k][name]
end
end
return arr

キーによるアクセスにこだわってるみたいなんだけど、これ何かご利益ある?
0815デフォルトの名無しさん2008/03/31(月) 18:28:08
その処理だけなら、ないんじゃない?
0816デフォルトの名無しさん2008/03/31(月) 20:06:55
「hのkのnameをarrに追加」と読み下せることを目的にしてるのかも
08176772008/03/31(月) 21:19:47
>>677です。
すいません。また教えてください。
IO.popenをつかってディーラーとAIでやり取りできるようになったのですが、
AIをpopenで起動するとコマンドプロンプトが表示されてしまいます。
コマンドプロンプトを表示しないでpopenする方法はないでしょうか。
ディーラーの部分はRuby/tkで実装していて、rubywで実行しています。
08186772008/03/31(月) 21:23:16
書き忘れましたが、実行環境はWindowsです。
0819デフォルトの名無しさん2008/03/31(月) 21:59:40
Rackって普通のCGIスクリプト(サーバーとして単体起動しない)でも使えるのかな?
試してみた人がいればぜひ教えてください
0820デフォルトの名無しさん2008/03/31(月) 22:29:44
RagelとRackって同違うんだっけ?
ステートマシンコンパイラとコンパイラコンパイラの違い?
分からん。
0821デフォルトの名無しさん2008/03/31(月) 23:02:08
Raccだよな多分。
RackはWEBアプリの仕組みの違いを吸収するフレームワークだっけ。

Ragelはステートマシンコンパイラらしいから字句解析に使えて、
Raccはパーサジェネレータで構文解析に使える。あわせて言語処理系でも作れる。
0822デフォルトの名無しさん2008/04/01(火) 03:42:20
>>817
> AIをpopenで起動するとコマンドプロンプトが表示されてしまいます。
> コマンドプロンプトを表示しないでpopenする方法はないでしょうか。
そのAIをGUIモードでコンパイルするか、
cygwinのrun.exeを間にかます。
0823デフォルトの名無しさん2008/04/01(火) 03:44:31
>>814
> # ネストしたハッシュの一番奥のvalueを配列にする
簡単に書くとこうか?

arr = []
h.each_value {|v| arr.concat v.values}
08248172008/04/01(火) 20:36:39
>>822
できましたっ
ありがとうございました。
0825デフォルトの名無しさん2008/04/01(火) 22:26:52
>>821
あ、ごめん Racc だった。
そっか、Racc は構文解析のみで字句解析は面倒見ないんだった。
そういえばraccの256倍本で正規表現でlexer書いてたな。なるほど。
ありがと。
0826デフォルトの名無しさん2008/04/02(水) 17:33:04
#!/usr/bin/env ruby
IO.open(10, 'w') { |io| io << 'HELLO 10' }

を./aaa.rbに保存し
./aaa.rb 10>./log
としたらlogにHELLO 10と書かれる計画だったのですが
./aaa.rb:2:in `initialize': Bad file descriptor (Errno::EBADF)とでてしっぱいしました

10>./logと書くとシェルがdup2(10,open("./log"))みたいのをしてくれるとおもったのですが
根本的にまっちがってるフラグ????
0827デフォルトの名無しさん2008/04/02(水) 18:17:46
>>826
dup2が理解できるレベルなら、素直にリファレンスを見なさい。
0828デフォルトの名無しさん2008/04/02(水) 19:09:44
>>826
うちではちゃんと動いた。
シェルは何使ってる?
08298262008/04/02(水) 19:18:47
うおおおおおおおおおおおおおおおおおおおおおおお うごきました
Zsh@cygwinなのですがbashからよんだらちゃんと動きました
ありがとうございます
0830デフォルトの名無しさん2008/04/02(水) 19:25:32
http://www2.uploda.org/uporg1346024.jpg
0831デフォルトの名無しさん2008/04/02(水) 19:30:57
827==830涙目?
0832デフォルトの名無しさん2008/04/02(水) 19:52:13
ブロックの前の空白が気になる
0833デフォルトの名無しさん2008/04/02(水) 20:03:14
うちは駄目、シェルは普段 tcsh なんで /bin/sh
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-freebsd6]
で >>826 と同じ結果
9 までは通るけど 10 以上だと駄目になる
0834デフォルトの名無しさん2008/04/03(木) 22:36:58
file descriptorが一桁しか使えない?
0835デフォルトの名無しさん2008/04/04(金) 00:16:16
if の条件が長くなって複数行になる時って、どうすればいい?
0836デフォルトの名無しさん2008/04/04(金) 00:18:27
自分が本当に正しいことをしてるのか考える
関数にまとめる
0837デフォルトの名無しさん2008/04/04(金) 00:45:04
Rubyに関数なんてありませんよ
0838デフォルトの名無しさん2008/04/04(金) 00:50:36
>>836
了解です。仕様的に、条件を複数行にはできないってことですね。
リファクタリングしてメソッドにします。
0839デフォルトの名無しさん2008/04/04(金) 01:00:58
>>838
え?別にできるけど。

if a == 1 &&
b == 2
 puts "hoge"
end

みたいなことだよね?
0840デフォルトの名無しさん2008/04/04(金) 01:11:11
>>839

if a == 1
&& b == 2
 puts "hoge"
end

こうしてました。。。こっちだとダメみたいです。
ありがとうございました。
0841デフォルトの名無しさん2008/04/04(金) 01:48:31
>>840
改行も区切りの一種になっているため、末尾に演算子があるとか、
カッコが閉じてないとか、明らかに行が終わっていない場合を除いて、
そこで式が終了する。
&&を次行の行頭に持っていきたい場合はカッコでくくればいい。
(あまりRubyらしくないけど)
0842デフォルトの名無しさん2008/04/04(金) 01:58:14
>>841
そうみたいですね。
ただ、以下のようにカッコで括ってみてもエラーでした。
ver.1.8.4 です。

if (a == 1
&& b == 2)
puts "hoge"
end
0843デフォルトの名無しさん2008/04/04(金) 03:21:10
>>842
if a == 1 \
&& b == 2
  puts "hoge"
end
0844デフォルトの名無しさん2008/04/04(金) 07:44:42
先に条件式の結果を出して、ローカル変数に入れるという方法もある

c = (a == 1) and (b == 2)
if c then
 puts "hoge"
end
0845デフォルトの名無しさん2008/04/04(金) 09:46:13
>>844
バカ発見
0846デフォルトの名無しさん2008/04/04(金) 09:57:48
if longlonglongcondition == value1 and verylonglonglonglongcondition == value2

がヨコに長くて嫌だって人に

c=(longlonglongcondition == value1 and verylonglonglonglongcondition == value2)
if c then

を勧めるのは、正直どうかと思わなくもない
0847デフォルトの名無しさん2008/04/04(金) 10:15:49
12345678901234567890123456789012345678901234567890123456789012345678901234567890
1 2 3 4 5 6 7 8

なんだかんだ言って80文字程度で改行するというのは今の時代にも生きてるんだな
0848デフォルトの名無しさん2008/04/04(金) 10:44:58
>>844 が馬鹿ってのはruby的にはそういうことしないってこと?
リファクタリングの1つだよな。
もちろん変数名はcとかじゃなくてちゃんと意味のある名前にするけどね。
08498482008/04/04(金) 10:46:18
ああ、ただ今回の要件には向かないな。失礼。
0850デフォルトの名無しさん2008/04/04(金) 11:01:20
要は>>846だな

Rubyの継続行のルールはようわからん
andとかorとか&&とか||の直後で改行した場合は必ず継続行とみなしてくれるのでそれ使ってる
0851デフォルトの名無しさん2008/04/04(金) 13:50:13
ようわからんからこそ、俺は常にバックスラッシュ。
0852デフォルトの名無しさん2008/04/04(金) 22:16:47
改行したところまでで完結した式とみなせるかどうか、だけのはずなんだがな。
0853デフォルトの名無しさん2008/04/04(金) 23:13:28
WindowsのRuby開発環境で一番人気って何ですか?
0854デフォルトの名無しさん2008/04/05(土) 00:52:59
cmd + edlin
0855デフォルトの名無しさん2008/04/05(土) 01:22:50
NTEmacs + ruby-mode
0856デフォルトの名無しさん2008/04/05(土) 02:03:35
>>853
WindowsでRubyを使うこと自体が間違い
0857デフォルトの名無しさん2008/04/05(土) 02:44:20
>>854
edlin使ってるヤツ見たことないw

つっても俺もVimだが
0858デフォルトの名無しさん2008/04/05(土) 03:16:26
>>853
eclipse
0859デフォルトの名無しさん2008/04/05(土) 05:29:04
cat+echo
0860デフォルトの名無しさん2008/04/05(土) 05:31:04
winか
type + echo
0861デフォルトの名無しさん2008/04/05(土) 06:20:46
Cygwin + Meadow
0862デフォルトの名無しさん2008/04/05(土) 07:46:42
>>853
一番人気と言えるようなものはない、が正解
0863デフォルトの名無しさん2008/04/05(土) 09:12:10
Eclipse + RDE
xyzzy + ruby-mode
VisualuRuby
Meadow + ruby-mode
NetBeans + Ruby Pack
Rubyスクリプト着色可能なエディタ

選択肢としてはこれくらい?
Vim系列って着色以上の機能ってあったっけ?
0864デフォルトの名無しさん2008/04/05(土) 09:14:42
3rd Rail
0865デフォルトの名無しさん2008/04/05(土) 15:20:34
IO.popen について質問です。
子プロセスの標準入力に書き込み、コプロセスの出力結果を読み取ろうとしています。

input = <<-END
aaa
bbb
ccc
END
output = nil
IO.popen('cat -n', 'w+') do |io|
  io.write(input)
  output = io.read()
end
print output

これを実行したところ、io.read() のところでプロセスが
ブロックされるようで、終了しません。
どうしたらいいでしょうか。
0866デフォルトの名無しさん2008/04/05(土) 15:24:58
RDEはブロック書いたときにしょっちゅう落ちてたからやめた。

>>863
Ctrl+Pでキーワード補完ぐらいなら
0867デフォルトの名無しさん2008/04/05(土) 15:28:08
io.close_write
しなきゃ
0868デフォルトの名無しさん2008/04/05(土) 18:41:16
>>867
>io.close_write
なにこれー こんなのあるかよ
ちょーさんくすです
0869デフォルトの名無しさん2008/04/05(土) 23:37:50
Rubyを始めたいのですがまず何をすればよいのでしょうか?
0870デフォルトの名無しさん2008/04/05(土) 23:41:17
>>869
>>2
0871デフォルトの名無しさん2008/04/06(日) 00:40:34
>>869
モルモン教信者になる。
0872デフォルトの名無しさん2008/04/06(日) 00:55:58
モジュールの深さってどのくらいがふつう?
module プロジェクト名
 module システム名
  module サブシステム名
   class クラス名
   end
  end
 end
end
とか深すぎ?
0873デフォルトの名無しさん2008/04/06(日) 01:12:09
そのへんは実際のディレクトリを反映するはず
規模にもよると思うんだが、個人で一生懸命作るぶんには

module アプリケーション名
class メインクラス
end
class いろいろクラス
end
module 便利モジュール
end
end

これくらい?
あまり深いとわけわかめだぞ
foo = AAA::BBB::new
foo.hoge
になるのが個人的限界
0874デフォルトの名無しさん2008/04/06(日) 01:21:51
>>873を複数作ってmoduleで包む
0875デフォルトの名無しさん2008/04/06(日) 07:46:15
Javaのpackageみたいな仕組み作ってくれよ
0876デフォルトの名無しさん2008/04/06(日) 11:26:40
>>872はちと深いなあという印象で、>>873は浅すぎるなあという印象
0877デフォルトの名無しさん2008/04/06(日) 12:49:08
3が深すぎで1が浅すぎだったら2しかないじゃん
0878デフォルトの名無しさん2008/04/06(日) 13:03:35
3深すぎ 1浅すぎ 2中途半端 なしすっきり

こうですか わかりません
0879デフォルトの名無しさん2008/04/06(日) 15:40:07
Rubyの達人は2.5とかが可能
0880デフォルトの名無しさん2008/04/06(日) 16:55:47
全部特異メソッドで頑張るという手も
0881デフォルトの名無しさん2008/04/06(日) 22:11:29
特異メソッドを得意メソッドにすればいいんですね
0882デフォルトの名無しさん2008/04/06(日) 22:27:13
徳井メソッドって高橋メソッドみたいなもん?
0883デフォルトの名無しさん2008/04/06(日) 22:30:16
>882
高橋と徳井じゃ実装してるメソッドが違うから
人間クラスから見た関係ではそうかもな。
0884デフォルトの名無しさん2008/04/07(月) 01:38:49
open-uriで質問です
あるURLを開くと、リダイレクトされた先がURLエンコードされていないファイル名を返してきます
そこでrubyは「C:/Ruby/lib/ruby/1.8/uri/common.rb:436:in `split': bad URI(is not URI?):(問題のリダイレクト先)」とエラーが出ます
これはどうすればいいんでしょうか?
0885デフォルトの名無しさん2008/04/07(月) 08:30:11
くさったヘッダを返すところが悪い。
Net::HTTPでがんばれ。
0886デフォルトの名無しさん2008/04/07(月) 11:48:28
require 'uri'
require 'open-uri' # and 'net/http'

begin
open(uri).read # ここでエラーが出る
rescue URI::InvalidURIError => ex
raise ex unless /\Abad URI\(is not URI\?\)/ =~ ex.message
raise ex if @invalid_uri_err == uri
Net::HTTP.start(uri.host, uri.port) {|http|
header = http.head(uri.path)
uri = URI.parse(URI.encode(header['location']))
}
@invalid_uri_err = uri
retry
end

こんな感じ?
0887デフォルトの名無しさん2008/04/07(月) 12:24:48
それだけだと uri が不明な変数だっていうエラーが出るだろうな
単体で試せる完全スクリプトの形してる割には罠っぽい(w

ruby って retry_once みたいなのって無いの?
0888デフォルトの名無しさん2008/04/07(月) 17:32:57
>>869
http://jp.rubyist.net/magazine/?FirstStepRuby
がおすすめ
0889デフォルトの名無しさん2008/04/07(月) 18:17:06
Rubyist Magazineを読んでてわからない所があったので質問させてください

http://jp.rubyist.net/magazine/?0023-Cgirb#l5
>String#<< ではなく += を使っている

これは何かダメなんでしょうか?
単なる好みの問題のような気がするのですが…
0890デフォルトの名無しさん2008/04/07(月) 18:21:02
新しくオブジェクトを作っているから
0891デフォルトの名無しさん2008/04/07(月) 18:28:38
うん、いいとこに気づいたな
String に << を使うと、オブジェクトはそのままで末尾に文字列が追加される
String に += を使うと、以前の文字列と足す文字列を足したものが新しいオブジェクトになる

本当に必要なのはただの長々とした文字列であるはずで、
毎回新しくオブジェクトが生成されるというのはとても無駄だ
0892デフォルトの名無しさん2008/04/07(月) 18:40:40
str の末尾に 'hoge' を追加する、という処理を体現するコードは
str = str + 'hoge'
ではなく
str << 'hoge'
である、というだけなんだけどね
str + 'hoge' が返すオブジェクトは str とは何の関連性もない

そんなん好みだろ、と言われてしまうとどうにもならんが、かといって
「str がメガ単位の大きさになるかもしれないから今回は + 使うのやめる」
というブレた判断をするのはそれはそれでとても不恰好だろ
0893デフォルトの名無しさん2008/04/07(月) 19:00:23
>>890-892
なるほど、そんな違いがあったのですね
ありがとうございました
0894デフォルトの名無しさん2008/04/07(月) 19:04:28
このへんがわかるとRubyが面白くなるが、症状が変なほうに進むと
「URIクラスにreplaceが無いのは変だ」とか言いだすので注意
0895デフォルトの名無しさん2008/04/07(月) 19:21:37
URIにto_strがないのが不便です
0896デフォルトの名無しさん2008/04/07(月) 19:38:07
せっかく削ったのに…
0897デフォルトの名無しさん2008/04/07(月) 19:57:33
まあ、パフォーマンス度外視なのがスクリプト言語だしね。
0898デフォルトの名無しさん2008/04/07(月) 20:22:00
require 'rubygems'したあとYAMLでファイルに保存するんだけど

File.open(file, "w") { |f|
YAML::dump(data, f)
}

と書いてしまうのはWindowsのbinnmodeとかあのへんの問題はない?
0899デフォルトの名無しさん2008/04/07(月) 20:56:42
>>898
……多分。
……YAML はテキストだし。
……まあ不安なら "w" を "wb" にでもしたらよろし。
0900デフォルトの名無しさん2008/04/08(火) 09:46:26
そこまで書いた上に気になってるなら、素直にbinmodeにすればいいと思う。
害はたぶんないだろう。
0901デフォルトの名無しさん2008/04/08(火) 10:46:31
DOSISHではないプラットフォームでも
テキストモードなら\r\nも改行文字として扱ってくれると便利なんだけど、
そうなっていない理由ってあるのかな。
日ごろ区別する必要のない人たちには不要な機能だから?
09029012008/04/08(火) 10:50:24
あ、>>901はテキストモードでの読み込み時の話ね。
0903デフォルトの名無しさん2008/04/08(火) 11:08:51
universal newlineだね。
導入しようという話はあるんだが。
0904デフォルトの名無しさん2008/04/08(火) 23:58:37
ゲーム作ろうとして、MyGame(Ruby/SDL の Windows バイナリ同梱)
をダウンロードしたんですけど、なぜかインストールできません。

だれか詳しい方、助けてください。(ちなみにOSはvistaでActiveRubyはインストール済みです)
0905デフォルトの名無しさん2008/04/09(水) 00:19:23
>>904
どの段階で失敗するのかをできるだけ詳しく書きましょう
0906デフォルトの名無しさん2008/04/09(水) 00:22:39
どうせ一人の力だけでは無理なんだし要点まとめる練習だと思うべし
質問のために要点まとめて問題点洗い出してたら解決したという困った事態がザラにある
0907デフォルトの名無しさん2008/04/09(水) 00:39:24
>>904
すみませんでした。もうちょっと詳しく書きます。
http://dgames.jp/archive/mygame/でmygame-0.9.1-rubysdl-1.3.0-mswin32-1.8.5-p12.zipをダウンロード
↓
デスクトップ上で展開
↓
MyGameフォルダ内のinstall_mygame.rbをダブルクリック
コマンドプロンプトが起動して、終了。
↓
MyGameのインストール確認のため、ruby consoleで「ruby -r mygame/boot -e ""」
と入力するが、以下のようなエラーメッセージが表示される。

C:/Program Files/ruby-1.8/lib/ruby/site_ruby/1.8/mygame.rb:1:in`require': no such
file to load -- sdl (LoadError)


こんな具合です。
0908デフォルトの名無しさん2008/04/09(水) 00:55:59
>>907
書いてある通りだろ
本来ならあるべき場所にsdl(sdl.rb)がないから、ロードに失敗した
その構造だとC:/Program Files/ruby-1.8/lib/ruby/site_ruby/1.8/sdl.rbがないのだろう

おそらく何かの原因でインストールに失敗している
0909デフォルトの名無しさん2008/04/09(水) 01:46:42
>>908
すみませn。ruby初心者どころかPG初心者レベルなので、具体的にどう対処すれば
よいのかわかると幸いなんですが・・・。
0910デフォルトの名無しさん2008/04/09(水) 01:49:49
>MyGameフォルダ内のinstall_mygame.rbをダブルクリック
>コマンドプロンプトが起動して、終了。

ホントはここでエラーメッセージが印字されてるんだろうなぁ…。
コマンドプロンプトから実行してみるとか。
0911デフォルトの名無しさん2008/04/09(水) 02:01:29
>>910さんのアドバイス通りやってみました。

・・・が結果は同じでしたorz
0912デフォルトの名無しさん2008/04/09(水) 02:49:21
いや、なにも改善してないんだからまた失敗するのは当たり前で…
コマンドプロンプトから実行しただけで良くなるわけが無くて…
エラーメッセージが吐かれたならそれを読み解けといってるわけで…
0913デフォルトの名無しさん2008/04/09(水) 02:57:48
Rubyは高級言語なのでWindowsユーザは別の言語をお使い下さい
0914デフォルトの名無しさん2008/04/09(水) 05:07:37
>>907
# 使ってないから知らんけどvistaなのが悪いとか?
mygame/rubysdl-1.3.0-mswin32-1.8.5-p12/README.ja.win32 読んでみ
特に 3.1 のところ
で、然るべき場所にそれらのファイルがあるかどうか確認
0915デフォルトの名無しさん2008/04/09(水) 08:46:36
>>909
ここは人力検索サイトじゃない
コマンドプロンプトが起動できるぐらいなら、まず自分で出来る限りのことをやれ

少なくとも
1. コマンドプロンプトの実行結果をきちんと読む
2. sdl.rbが存在するかどうかを確認する
ぐらいはできるだろ?

あときちんとsage
0916デフォルトの名無しさん2008/04/09(水) 10:09:08
html の table を生成するループってどんな風に書くのがいいの?
今こんなんなんだけど
<table><tr>
<% for data.each_with_key{|x, i| %>
<td><% x.name %></td><td><% x.value %></td>
<% if i % 5 == 0 %></tr><tr><% end %>
<% end %>
</tr></table>
0917デフォルトの名無しさん2008/04/09(水) 10:23:03
ERBならそれでいい
HTMLとして読みやすいことが第一
Rubyとしての論理構造を気にするなら最初からRubyで書け(w
0918デフォルトの名無しさん2008/04/09(水) 10:41:30
システムが使ってなくて目立つprefixってなにかありますか?
_myvar =3 は一応通るみたいですが。
0919デフォルトの名無しさん2008/04/09(水) 10:57:16
エディタにハイライトしてもらうといいぞ
背景を黄色にするとか目立って良さげ

いやわりとマジで
目立つかどうかを名前に負わせるのは不条理

マニュアルに「使える文字」が説明されてるからそれから好きなの選べ
ttp://www.ruby-lang.org/ja/man/html/_BBFAB6E7B9BDC2A4.html
0920デフォルトの名無しさん2008/04/09(水) 11:42:24
>>917
縦にデータ並べたいときとか列の数変えるとき便利かと思ったんですけどこのままでいですかね
0921デフォルトの名無しさん2008/04/09(水) 12:53:13
>>946からはそういう目的があるとはあんま読めんな

メソッドにして切り出すとスクリプトとしてもうちょっと明快になる気もするが、
ERBならそのまま記述したほうがおそらく素直
ERB使ってるのにRubyスクリプトとして凝らせるというのは方向性が逆

<table><tr>
<% for data.each_with_key{|x, i| %>
<% data2cell_and_print_sepalater_per_5(x,i) %>
<% end %>
</tr></table>

と書いたとしてもERBとして可読性はあがらない
あとeach_with_keyってなんじゃらほい
0922デフォルトの名無しさん2008/04/09(水) 20:32:25
スレ違いだったらスルーして。
Rubyにredmine入れたんだけど、
英語表記なんだよね。

redmineの設定メニューで
Japaneseにしてるのに英語のまま。

だれか経験したことないですか?
0923デフォルトの名無しさん2008/04/09(水) 22:40:35
rubyの中からシェルの環境変数を設定するにはどうしたらいいですか?
ENVに代入しても、Rubyの中だけでしか有効ではないようです
0924デフォルトの名無しさん2008/04/09(水) 22:56:01
>>923
まあそりゃそうだろ
「自分」が起動したシェルにしか自分が設定した環境変数の効果は及ばない
「他人」が起動したシェルにも設定を及ぼしたいのなら、OSが管理するシェルの起動設定そのものに手を入れるしかない
それはRubyの仕事ではないので、使ってるシェルの設定ファイルとか設定コマンドとかを直接編集すれ
0925デフォルトの名無しさん2008/04/10(木) 00:56:44
>>922

インストール時の rake load_default_data で ja を選んだ?
あと、ユーザごとに表示言語の設定があるので、マイアカウントの設定で日本語を選んで。
0926デフォルトの名無しさん2008/04/10(木) 09:38:38
>>924
Rubyでシェルのコマンド文字列を生成して、シェルのバッククオートを使うとか、
Rubyの中からサブシェルを起動するとか。
0927デフォルトの名無しさん2008/04/10(木) 13:04:18
脱初心者の目安ってありますか?
0928デフォルトの名無しさん2008/04/10(木) 13:08:30
>>926
同じことだろ
0929デフォルトの名無しさん2008/04/10(木) 13:22:56
>>927
Ruby学習者の15段階

レベル0: Rubyを宝石の名前以外に思いつかない
レベル1: 関数的メソッドだけで乗り切る。ドットの意義がわからない
レベル2: 関数的メソッドを自作する。ドットを「〜の」と訳すがオブジェクトはよくわからない
レベル3: クラスを形だけ自作するがinitializeのスペルを間違える。printfをダサいと感じるようになる
レベル4: モジュールを形だけ自作するようになる。RubyをBetterPerlだと吹聴するようになる
レベル5: cgi.rbを読んで絶望する。array.rbを探すがRubyスクリプトとして存在しないことに憤りを覚える
レベル6: 自作のスクリプトを公開するがバージョン0.1.3で放置される。「それRubyでもできますが」が口癖になる
0930デフォルトの名無しさん2008/04/10(木) 13:31:29
うわ間違えた、printfではなくsprintfね
ちなみに
「全てを自作オブジェクトで表現しクラス構造が網の目のようになる」
のレベル7の次くらいで有用性を許容します
0931デフォルトの名無しさん2008/04/10(木) 13:37:31
添付ライブラリのソースを読めるくらいが初心者脱出の目安だと思う…
何やってんだかさっぱりわからん、といううちはまだ初心者ということで
0932デフォルトの名無しさん2008/04/10(木) 14:42:05
optparseを読めないと初心者脱出にならないのか!
0933デフォルトの名無しさん2008/04/10(木) 15:06:39
あれはコメント部分に AA 解説がある時点で危険信号が点ってはいるな
身近なとこで net/ の下くらいでいいんじゃないかとも思う
comlex.rb とかも数学の知識ないと読めねーぞ
0934デフォルトの名無しさん2008/04/10(木) 20:08:47
>>925
それでした。
マイアカントから設定できたんですね。

てっきりsettingからやるのかと思ってました。
0935デフォルトの名無しさん2008/04/11(金) 03:53:51
あるディレクトリの配下を、別のディレクトリの配下に再帰的にコピーしたいです
シェルだと、
cp /path/to/src/* /path/to/dest/
でコピーできますが、これをRubyでやろうとして、
FileUtils.cp_r('/path/to/src/*','/path/to/dest/')
と書くとエラーになります。
うまくコピーするにはどう書いたらいいですか?
0936デフォルトの名無しさん2008/04/11(金) 03:54:38
シェルの場合
cp /path/to/src/* /path/to/dest/ -r
でした
0937デフォルトの名無しさん2008/04/11(金) 04:09:47
ワイルドカードがいらないんじゃないの
0938デフォルトの名無しさん2008/04/11(金) 07:15:27
>>935
FileUtils.cp_r(Dir.glob('/path/to/src/*'),'/path/to/dest/')
0939デフォルトの名無しさん2008/04/11(金) 08:42:10
マニュアルくらい読んどけって話だな
30秒もあれば理解できることだったのに
というか、シェルじゃないのにシェルグロブが利用できると考えるのがそもそもおかし以下略

> FileUtils.cp_r(src, dest, options = {})
> src を dest にコピーします。src がディレクトリであったら再帰的にコピーします。
> その際 dest がディレクトリなら dest/src にコピーします。

> FileUtils.cp_r(list, dir, options = {})
> list[0]、list[1], list[2], ... をディレクトリ dir の中にコピーします。
> list[n] がディレクトリなら再帰的にコピーします。

ということで、ファイルパス文字列かファイルパスが入った配列のどっちかしか受け付けね
0940デフォルトの名無しさん2008/04/11(金) 09:00:36
Dir.glob がライブラリの内部で正規表現使って記号を探して
自前でディスクを走査して配列返してるだけってのを知ったときはちょっとショックだった
0941デフォルトの名無しさん2008/04/11(金) 12:02:48
>>941
どういう動作を想定してた?
09429412008/04/11(金) 12:03:38
しまった。>>941じゃなくて>>940ね。
0943デフォルトの名無しさん2008/04/11(金) 12:18:50
「* や ? を検知したら Ruby を起動したシェルに ls で丸投げ」とかじゃね
期待されてる正当な結果が返る完全動作だが、Ruby から見た結果は環境依存でえらい不定になるな(w
0944デフォルトの名無しさん2008/04/11(金) 12:30:07
globは低機能過ぎるよ。
ls,dirと同じくらい多彩なオプションがないと面倒で使ってられない。
0945デフォルトの名無しさん2008/04/11(金) 12:48:12
「ファイル一覧が欲しい」というニーズの8割くらいはあれで吸収してると思うけどね
99パーセントにする理由はあまり感じないな
0946デフォルトの名無しさん2008/04/11(金) 12:54:16
ls を肥大化させたのは >>944 のような連中なのだろうな、と思う
KISS が常に正しいとは言わんが、フィルタ1個で済むものくらいはフィルタに任せようぜ
0947デフォルトの名無しさん2008/04/11(金) 13:49:04
glob はUnicodeを理解してくれないからちょっと嫌い
0948デフォルトの名無しさん2008/04/11(金) 14:06:06
Ruby2.0からglobは引数なしで常にルートから全ファイル列挙になります。
0949デフォルトの名無しさん2008/04/11(金) 17:40:40
参考までに状況:
windows
SketchUpっていう3Dソフトでrubyを使っている
SketchUpのインストールフォルダのResourceフォルダに
examples.strings という名前のファイルがあって内容は以下

"FPS"="FPS";
"Animations"="アニメーション";
"Spin View"="ビューを回転";
"Stop Spinning"="回転を停止";
...

質問:
サンプルスクリプトに

$exStrings = LanguageHandler.new("Examples.strings")
example = $exStrings.GetString("Box Dimensions")

みたいなのがあるんですが
SketchUpのRubヘルプやRubyAPIドキュメントには該当するオブジェクトが見つかりません
多言語に対応するためのオブジェクトというのは分かるのですが...

LanguageHandlerというオブジェクトはrubyでは知られたオブジェクトですか?
そうでないなら
こういった使い方をするオブジェクト(クラス?)に心当たりはありますか?
0950デフォルトの名無しさん2008/04/11(金) 18:01:22
少しググれば出てくるじゃないか
ttp://www.suwiki.org/suwiki/index.php?title=LanguageHandler
0951デフォルトの名無しさん2008/04/11(金) 18:02:43
あーんちょっと遅かった
ttp://ja.sketchup.com/?sid=417
0952デフォルトの名無しさん2008/04/11(金) 18:28:07
>>950
あ・・・あれ?
ぐぐっても出ないですけど
suwiki自体はブックマークしてたのに
調べなかったのはうかつでした

なんにしても有難うございます
0953デフォルトの名無しさん2008/04/11(金) 23:49:06
matz死んだの?日記が更新されない・・・。
0954デフォルトの名無しさん2008/04/12(土) 01:55:41
メタボと糖尿でめがねボーン!してる最中なんだよ。
0955デフォルトの名無しさん2008/04/12(土) 19:43:53
「文字列がヌル文字列でない」をシンプルに調べるメソッドはないんですか?
empty?の逆です
countやlengthでも調べられますがなんか美しくないので
0956デフォルトの名無しさん2008/04/12(土) 19:58:38
ifの代わりにunless使うとかじゃダメなわけ?
0957デフォルトの名無しさん2008/04/12(土) 19:59:02
Ruby のヌル文字は \000 だっけ?
文字列に \000 があるかどうかを調べればいいのでは
もし NilClass の nil のことならそれは「ニル」だ

puts 'strはnilではありません' unless str.nil?

という処理をするのが普通
0958デフォルトの名無しさん2008/04/12(土) 20:01:39
あ、Rubyでは
「str が '' であること」
と
「str が nil であること」
は多くの場合全く別物として区別されるので、
できれば区別して使うようにしていくといい
0959デフォルトの名無しさん2008/04/12(土) 20:05:15
ヌル文字列=空文字列

&& でつないでる論理式の一部だったりとかで、論理をひっくり
かえすと不自然な場合だったら !foo.empty? を使うかな、自分なら。
0960デフォルトの名無しさん2008/04/12(土) 20:14:12
「Rubyにはヌル文字列などというものはありませんが何か」がベストアンサー

>>958
str = '' は str = String.new だからなあ

unless str.nil? || str.empty? then
puts 'strには何らかの値が入ってます'
end

こんなんだな
0961デフォルトの名無しさん2008/04/12(土) 20:21:15
ありがとうございます
二重否定でしか書けないんですか・・
二重否定はあまり美しくないように思うのですがマッツ的にはそうでもないのでしょうか
0962デフォルトの名無しさん2008/04/12(土) 20:25:02
気に入らないなら
class String
def mogera?
!empty? # or size != 0
end
end
とでもしとけ。

だいたい元の質問自体「〜でない」をどう書くかと尋ねてるジャマイカ。
0963デフォルトの名無しさん2008/04/12(土) 20:33:34
二重否定ではない
「nil かどうか」
「サイズがゼロかどうか」
を調べてるだけだ
それが unless でひっくり返るから普通の一重否定
0964デフォルトの名無しさん2008/04/12(土) 23:52:09
http = Net::HTTP.new('www.google.com')
http.get('/')

これでも動いてしまいました。何故でしょうか。
Net::HTTP#startとfinishの意味がよくわかりません。
0965デフォルトの名無しさん2008/04/13(日) 00:15:18
>>964
動いたなら別にいいじゃんよ

ソース読むと見当がつくが、get とかそういう「Webサーバにアクセスするメソッド」の中では
request というメソッドが総合的に呼ばれてる。
んで、そのrequest メソッドの最初で
unless started?
start {
return request(req, body, &block)
}
end
という処理をしてる。
つまり、接続を開始してなければ接続を開始してもう一度requestする、という処理だ。
これのおかげで、明示的にstart されてない下品な使用法をされても例外を出さないようにしてる。


次、start/finishは何をしてるのか問題。
ぶっちゃけて言うと、start時には TCPSocket.open(conn_address(), conn_port()) して、
finish 時には @socket.close if @socket and not @socket.closed? してる。
サーバにTCPレベルで接続する処理をしてるわけだな。これが開始済みだと さっきの started? は true を返す。
仮に明示的に start しなくても request メソッドが内部で呼ばれたときに開始されるだけ。
で、start ブロックの終了時には ensure によって finish が呼ばれてる。
だからブロックつきstart使おうぜとか、そういう話。
0966デフォルトの名無しさん2008/04/13(日) 00:31:26
「どれだけ短く記述できるかが言語の利便性を決めるぜコンテスト」
みたいなのに影響されるとこうなりがちだよね。
start 単体かブロックつき以外はサポートしません、というようなスタンスなら
もっとすっきりするんだろうけど。

>>964
変なこと言うとエラー処理に頼って省略するのが便利でかっこいいと勘違いする人がいるので、
その記述は不正だとたしなめておく。start で用が済む限りは素直に start を使うこと。
そんな俺は method_missing をキモいと断言する人種です。
0967デフォルトの名無しさん2008/04/13(日) 00:35:40
> 「どれだけ短く記述できるかが言語の利便性を決めるぜコンテスト」
何そのputs

irb> puts [1,2,3]
1
2
3

言語や付属ライブラリ作成の初期に変な意思決定物が混じると後々大変
0968デフォルトの名無しさん2008/04/13(日) 00:39:02
メソッドfoo, bar, bazの順に呼ばないとバグりますなんてやだよ
そんなうんこライブラリはhogeでラップしたくなる
0969デフォルトの名無しさん2008/04/13(日) 00:43:01
>>968
いやマニュアルくらい読めよそこで威張んなよ
prepare
start
finish
を
finish - start - prepare
の順に呼ぶような奴まで例外処理でフォローできんわ
0970デフォルトの名無しさん2008/04/13(日) 00:47:02
メソッド名は適切にしておいて総合的な便利メソッドを提供しましょうってことだね

RubyForgeにあるライブラリでは時々変なのがあるよな
ソース読んでもどれをどう使っていいんだかよくわからないような奴
0971デフォルトの名無しさん2008/04/13(日) 00:50:53
>>961
そもそもempty?と対になる適切なメソッド名はあるのか?

>>967
putsは純粋にそういう役割のメソッドだろ。実際に利便性も良い
気になるならwrite使うなり、to_sと組み合わせるなりすればいい
0972デフォルトの名無しさん2008/04/13(日) 00:57:11
puts の「配列を自前で展開して改行つきで書き出す」という役割が妥当とはあんまし思えないんだが…
何かの言語で puts に相当する機能があったりしたのかね

>>971
stuffed? でどうだろう
0973デフォルトの名無しさん2008/04/13(日) 00:59:08
改行がついている場合は余分な改行を出力しない、という
puts の仕様が鬱陶しくて・・・。
0974デフォルトの名無しさん2008/04/13(日) 01:11:53
>>973
あれは微妙に不便
機械的に\nか\r\nをつけて出力してくれたほうがよっぽど楽
これも「こうしてあったほうがワンライナーが短く書けるのでPerlに勝つる」とかいう
くだらん見栄の残滓なんだろう
0975デフォルトの名無しさん2008/04/13(日) 01:14:07
まあ Perl に puts はないけどな。
0976デフォルトの名無しさん2008/04/13(日) 01:18:52
>>974
普及成功したと言える今になって昔の戦略を非難するのはズルい気もする
まあこれに関しては最初から間違ってたような感じはしないわけではないが(w
1.9で実は無くして様子みてるとかないかな
0977デフォルトの名無しさん2008/04/13(日) 01:35:44
>>975
perl6でsayが追加されたな。
改行の仕様は知らんけど。
0978デフォルトの名無しさん2008/04/13(日) 01:36:53
say(笑)
こっちも対抗して
hiを追加だ
0979デフォルトの名無しさん2008/04/13(日) 02:19:58
RubyからCで作られたライブラリの関数を呼びたい場合、
APIとして用意された関数をラッピングするだけで使えますか?
0980デフォルトの名無しさん2008/04/13(日) 09:53:29
Win32APIならそのまま呼べるよ
0981デフォルトの名無しさん2008/04/13(日) 16:01:34
誰か次スレお願い致しますでござる
俺は先週立てたから駄目なのよ

で、質問なんだけど、Rubyでできた2chアクセススクリプトってどっかにある?
自分で書いててそんなん公開してる人いなさそうだなと思ったんだけど、
Content-Lengthでファイルの差分取得とか考えるのめんどくさいんよ
0982デフォルトの名無しさん2008/04/13(日) 16:05:15
>>981
open-uri で注意深く作れば、2chから妙なデータが送られてこない限りは普通にできる
ただの HTTP アクセスだから
0983デフォルトの名無しさん2008/04/13(日) 18:12:46
GoRuaとかにあるだろ。
0984デフォルトの名無しさん2008/04/13(日) 18:24:39
FileUtilsとか、実体はRubyだから、
エラーが平気でライブラリの内部で起こる。
それってどうなの?
0985デフォルトの名無しさん2008/04/13(日) 18:54:45
日本語でおk
0986デフォルトの名無しさん2008/04/13(日) 19:08:28
ライブラリの内側で言語レベルのエラーが発生するっておかしくね?
もっとラップしたらいいのに
0987デフォルトの名無しさん2008/04/13(日) 21:06:11
class Myclass
@@var
end

外部からこのクラス変数@@varにアクセスするにはどうすればいいのですか?

Myclass.var ?
Myclass::var ?
Myclass.@@var ?
それともインスタンス変数と同じようにアクセサメソッドが必要ですか?

プログラム自体初めてなので馬鹿っぽい質問になってると思いますが教えてください。お願いします。
0988デフォルトの名無しさん2008/04/13(日) 21:13:35
Myclass.var
09899872008/04/13(日) 21:17:12
>>988
ありがとうございます!
単純にMyclass.varでよかったんですね。
今ネットで調べてたら::varは定数にアクセスする時でした。勘違い
0990デフォルトの名無しさん2008/04/13(日) 21:22:08
>>989
アクセッサもいるお
0991デフォルトの名無しさん2008/04/13(日) 21:25:51
class Myclass
@@var = 12345
def self.var
@@var
end
end

p Myclass.var #=>12345
ね
09929872008/04/13(日) 23:42:01
丁寧にありがとうございます。
つまりクラス変数もインスタンス変数と同様にアクセサメソッドが無ければアクセス出来ない、
けれどインスタンス変数のようにattr_accessor :var という書き方は出来ないから
自分でアクセスするためのクラスメソッドを用意する必要がある
という認識で合ってますか?
0993デフォルトの名無しさん2008/04/13(日) 23:44:22
スレ上近年稀に見る素直な解釈だ
0994デフォルトの名無しさん2008/04/14(月) 00:00:56
foo = bar if !foo

if !foo
foo = bar
end


上と下の違いを教えてください。
09959872008/04/14(月) 00:01:04
>>993
ありがとうございます!モヤモヤが晴れてすっきりしました。
0996デフォルトの名無しさん2008/04/14(月) 00:20:41
>>994
if
…
end
をひとカタマリとして考えた場合、完全に一緒
返す値も一緒
あと誰かスレ立てようぜ
0997デフォルトの名無しさん2008/04/14(月) 00:27:40
Ruby 初心者スレッド Part 19
http://pc11.2ch.net/test/read.cgi/tech/1208100393/
0998デフォルトの名無しさん2008/04/14(月) 00:34:56
テンプレ二重投稿&連投規制で最後欠けたorz
0999デフォルトの名無しさん2008/04/14(月) 02:19:14
うめ
1000デフォルトの名無しさん2008/04/14(月) 02:19:34
うめ
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。