Ruby 初心者スレッド Part 14

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
関連スレやURLは>>2-10あたりを見てください。Ruby on Railsの質問はWebProg板の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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
2デフォルトの名無しさん:2007/08/25(土) 13:07:45
本スレ
Rubyについて Part 28
http://pc11.2ch.net/test/read.cgi/tech/1187298711/

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

Railsスレ
【Ruby】Ruby on Rails Part3
http://pc11.2ch.net/test/read.cgi/php/1170760209/
3デフォルトの名無しさん:2007/08/25(土) 13:11:06
4デフォルトの名無しさん:2007/08/25(土) 13:11:40
5デフォルトの名無しさん:2007/08/25(土) 13:12:21
= 公式/非公式関連リンク

== Rubyを知る
Ruby Home Page
http://www.ruby-lang.org/ja/

== Ruby使用時の調べもの
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/
6ここまでテンプレ:2007/08/25(土) 13:14:25
== Ruby使用時の探し物
RAA - Ruby Application Archive
http://raa.ruby-lang.org/
RubyForge
http://www.rubyforge.org/
# 共にRubyのアプリやライブラリが検索できる

== Ruby関連のニュースや読み物
日本Rubyの会 公式Wiki - 日本Rubyの会Wiki
http://jp.rubyist.net/

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

== いろいろRubyサイト
Matzにっき … Ruby作者の日記
http://www.rubyist.net/〜matz/

Ruby hotlinks 五月雨版 … Ruby関連の日記や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/
Ruby Weekly News @ Ruby Garden
http://www.rubygarden.org/rurl/html/
7デフォルトの名無しさん:2007/08/25(土) 14:52:09
死ね
8デフォルトの名無しさん:2007/08/25(土) 15:51:57
>>7
ツンデレ?
9デフォルトの名無しさん:2007/08/25(土) 17:33:35
厳密にはRubyあんま関係ない気がしますが、EUC-JPの「〜」(キーボードから入力できる普通のやつ)を
utf-8に変換すると化けます。

$ ruby -e "require 'nkf'; puts NKF.nkf('-Ew,-Lu,-m0x --cp932','うんにょろ〜うんにょろ〜')"> u.txt

u.txt の表示結果
うんにょろ縲怩、んにょろ縲

$ ruby -v
ruby 1.8.2 (2005-04-11) [i386-linux]
$ nkf --version
Network Kanji Filter Version 2.0 (4/0401/Shinji Kono)

半角カタカナに当たるものは極力維持したいです。
RSS出力に使うのでutf-8は避けきれません。うまい方法ありませんか?
10デフォルトの名無しさん:2007/08/25(土) 18:12:38
Windowsなら化けない
11デフォルトの名無しさん:2007/08/26(日) 09:59:29
wxRubyを使ってたんですが、ListCtrlにset_background_colourで背景色
を設定しようとしたら
`set_background_colour': stack level too deep (SystemStackError)
と出て落ちてしまいます。
ほかのコントロールは普通に背景色設定できるんですが、
ListCtrlは何か違うんでしょうか?
12デフォルトの名無しさん:2007/08/26(日) 22:34:20
ちょっとした、スレッドとSocketの勉強をしています。
そこで
accept = TCPServer.open(8080)
while true
Thread.start(accept.accept) do |s
s.gets
print $_
end
end

のようなRubyの解説サイトにあったコードを書いたのですが…。
スレッド内からprintのような関数は使えないのでしょうか?
全く文字を表示してくれません。
また、print $_の部分に
File.open("log.txt","w") do |f|
f.write(f)
end
のようにファイル出力させても、ファイルが出力されません。
スレッド内で、ファイル出力や標準出力させるにはどうすれば良いのでしょうか?
念のため、排他的処理をしようとm=Mutex::newをやってから
print $_をm.synchronize{}で囲っても結果は同じでした。
環境は
ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-cygwin]
です。
よろしくお願いします。
13デフォルトの名無しさん:2007/08/27(月) 10:21:53
新スレなのに質問ばっかで回答Neeeeeeeeeeeeeeeeee
14デフォルトの名無しさん:2007/08/27(月) 12:29:57
>>12
そもそもs.getsで何も受け取ってないとか
15デフォルトの名無しさん:2007/08/27(月) 14:02:58
>>12
> Thread.start(accept.accept) do |s
最後にパイプが抜けてるのはコピペミス?
16デフォルトの名無しさん:2007/08/27(月) 16:16:46
open-uriで追加ヘッダフィールドを渡す場合、マニュアルによれば

open(uri, 'Cookie'=>cookies,'Connection'=>'keep-alive','Keep-Alive'=>'30')

などいちいち直に書かなくてはなりません。なんだか面倒です。
「ハッシュに格納しておいたヘッダフィールドをちょっと加工して渡す」というような便利な方法はありませんか?
17デフォルトの名無しさん:2007/08/27(月) 16:47:26
ハッシュそのまま uri のあとに渡してもダメ?
18デフォルトの名無しさん:2007/08/27(月) 17:00:01
OpenURI.open_uriを読む限りでは…よくわからんな
19デフォルトの名無しさん:2007/08/27(月) 17:07:32
>>12
別のアプリから何か送ってやらないと何も表示されないだろ
そのスクリプトを動かしておいて、別のコンソールから
ruby -rsocket -e "s=TCPSocket.open('localhost',8080);s.write('foobar');s.close"
とかやってみれ
20デフォルトの名無しさん:2007/08/27(月) 18:23:13
>>16
メソッド引数のハッシュリテラルの{}は省略することが出来るので
open(uri, 'Cookie'=>cookies,'Connection'=>'keep-alive','Keep-Alive'=>'30')
は実際には
open(uri, {'Cookie'=>cookies,'Connection'=>'keep-alive','Keep-Alive'=>'30'})
と同じこと、ですから
extraheader = {'Cookie'=>cookies,'Connection'=>'keep-alive','Keep-Alive'=>'30'}
open(uri, extraheader)
としてもOKです

ところで、引数のハッシュリテラルの{}が省略可能ってマニュアルのどこかに記述してあるのかな?
私はわりと長い間知らなかったんだけど…
21デフォルトの名無しさん:2007/08/27(月) 18:57:00
>20
ttp://www.ruby-lang.org/ja/man/?cmd=view;name=%A5%EA%A5%C6%A5%E9%A5%EB#a.a5.cf.a5.c3.a5.b7.a5.e5.bc.b0
> メソッドの引数の末尾に要素が1つ以上のハッシュを渡す場合は、{, }を省略することができます。
> ただし、obj[...] 形式のメソッド呼び出しと配列式では、要素全体がハッシュの場合に限り、 {, }を省略することができます。

ただ、ほとんどの人はこんなとこ読んでないしほとんどの解説では説明してないはず。
22デフォルトの名無しさん:2007/08/27(月) 18:58:18
っていうか、むしろ、なんで省略なんかできるようにしたのかさっぱりわからん
これで誰が喜ぶんだよ
23デフォルトの名無しさん:2007/08/27(月) 19:04:59
キーワード引数のエミュレートだから
ピカチュウ本(初版)には書いてあったよ
このあたりはるりまでいくらか改善されるのだろうか・・・
24デフォルトの名無しさん:2007/08/27(月) 22:19:46
プログラミングRubyの第二版には書かれてた。わりと初めの方だったと思う。
25デフォルトの名無しさん:2007/08/28(火) 01:58:17
>>22
メソッド呼び出し時の引数のHashの { } が省略できると、( ) も省略できるので個人的には多用している。
( ) なしで { } を書くとブロックとみなされちゃうのよねん。
26デフォルトの名無しさん:2007/08/28(火) 03:36:55
なるほどというか、そのためなのかな
27デフォルトの名無しさん:2007/08/28(火) 08:27:28
メソッド呼び出しの () は常につけようぜ
28デフォルトの名無しさん:2007/08/28(火) 09:01:22
()は付けるなって規約に書いてたけど・・・
29デフォルトの名無しさん:2007/08/28(火) 09:09:01
printとかputs以外は()付けてるなあ
30デフォルトの名無しさん:2007/08/28(火) 09:11:44
引数がある場合のみ絶対つける

いや、foo hoge huga と並んでたとして、
これがメソッドfooに変数hogeとメソッド(の返り値)hugaを渡してるもんだってわかりにくいだろ

いくらRubyがうまく解釈してくれるから動くからって言ったって、書いてる人間がわかりにくかったら意味ねーよ、と思ってる
常につけないメリットってなんじゃらほい
31デフォルトの名無しさん:2007/08/28(火) 09:39:27
漏れはプロシジャ的に呼ぶ時はつけなかったりする

>>30
カンマカンマ
32デフォルトの名無しさん:2007/08/28(火) 11:12:58
>>9
'-Ewxm0 -Lu --no-best-fit-chars' でどうでっしゃろ?
33デフォルトの名無しさん:2007/08/28(火) 12:00:01
arr = []
while gets
 arr << $_
end
を一発で書く方法ないですか?
34デフォルトの名無しさん:2007/08/28(火) 12:03:12
readlines
35デフォルトの名無しさん:2007/08/28(火) 12:18:35
関数的メソッドgetsとwhileのタッグを広めた奴の罪は根深いな
36デフォルトの名無しさん:2007/08/28(火) 13:15:31
普及 (Perl からの移行) を促進するには仕方なかったのだろうか?
37デフォルトの名無しさん:2007/08/28(火) 13:23:42
引数が長過ぎて途中で改行する時だけ()つける。
そうしないのruby-modeのインデントが変なんですもの
38デフォルトの名無しさん:2007/08/28(火) 13:52:01
while line = gets
p line
end

という、whileと謎の語getsを用いたループは

ARGF.readlines.each do |line|
p line
end

という、IOオブジェクトから読んで配列にしたものをeachで回すのと動作同じ
# 細かいこと言うの禁止
理解的にはこっちのほうが素直だと思う(記述がwhileよりヨコに長くなるのが難か)

最初にgetsで習うとARGFの存在を認知しにくいんじゃないかなあ

>>33
ということで、上記の配列部分
arr = ARGF.readlines
39デフォルトの名無しさん:2007/08/28(火) 15:13:11
そのループの例、readlinesいるか…?
40デフォルトの名無しさん:2007/08/28(火) 15:26:05
IOクラスのインスタンスが生成されてるはずだからARGF.eachでそのまま動くはず
というかARGF.readlinesのreadlinesもクラスメソッドではなくインスタンスメソッドなんじゃね?
41デフォルトの名無しさん:2007/08/28(火) 15:57:15
>>38
全然違うよ

while line = gets; p line; end

この場合の gets は $stdin.gets の略。ARGF は

% hoge.rb foo.txt bar.txt

みたいにしたときに foo.txt, bar.txt の内容が入ってる
仮想的なファイルオブジェクト(オープン済み)
4241:2007/08/28(火) 16:07:33
すまん大嘘書いた(;´д`) Ruby マニュアルより
> ARGF
> スクリプトに指定した引数 (ARGV を参照) をファイル名とみなして、
> それらのファイルを連結した 1 つの仮想ファイルを表すオブジェクトです。
> ARGV が空なら標準入力を対象とします。

細かいことはさておき>>38のでよかったんだな。申し訳ない
43デフォルトの名無しさん:2007/08/28(火) 16:21:40
readlines みたいに (ファイルがでかいと) メモリを湯水のように使いそうな
メソッドを使うのはいかにも富豪プログラミングっぽくってなんかイヤだなあ、
と思う俺は我ながらかなりしみったれてるな、と感じる今日このごろ。
44デフォルトの名無しさん:2007/08/28(火) 16:44:08
本当にちょっとずつ読むようなメモリに優しいメソッドってそもそもRubyに少ないような…

最近は瞬間的なメモリ使用量増大はもうあきらめて、
なるべく不要になった直後にarr.clearとかstr=nilとかするようにしてる
これはこれでなんか空しい
45デフォルトの名無しさん:2007/08/28(火) 22:13:36
1.9 で readlines も Enumerator を返すようには・・・ならんか。
ファイルを一揆読みしたいだけのときに勝手に遅延されたらかなわんしな。
46デフォルトの名無しさん:2007/08/28(火) 22:36:26
メソッド呼び出しにカッコ付けるか付けないかは
俺の場合はブロック以外の引数を見て

引数なしならいつもカッコなし
引数が複数行に渡るならいつもカッコあり(
)
x = 引数がありメソッドの戻り値を得たいなら(カッコあり)
カッコ(あり) if 引数があり後に修飾子が付く
引数があっても 後に修飾子が付かず,戻り値も得ないなら,カッコなし
47デフォルトの名無しさん:2007/08/28(火) 23:50:06
ARGFがIOオブジェクトだって言われてて、
ARGF.eachとかもよく使うんだが、
ふと気になってp ARGF.classしたらObjectだったような
記憶がある
48デフォルトの名無しさん:2007/08/28(火) 23:57:07
IOオブジェクトのメソッドが使えるってだけで、厳密にはIOインスタンスを返してるのではないはず

注意深い人の説明は「ARGFはIOオブジェクトのメソッドが使えますよ」というような文言になってる
49デフォルトの名無しさん:2007/08/29(水) 00:09:05
作者さんは
> IOクラスと互換性のあるStringIOクラスやARGFオブジェクト
という表現をしてるな
ttp://itpro.nikkeibp.co.jp/article/COLUMN/20070611/274310/

ちなみにこの一連の連載はなかなか面白い読み物なのでどうしても暇なときとかに読むと良
50デフォルトの名無しさん:2007/08/29(水) 00:17:10
is_a? よりrespond_to? で考えよう
というと広げすぎor的外れかな
51デフォルトの名無しさん:2007/08/29(水) 00:56:10
相談させてください。
Ruby で派生する場合、
下記コード1のように書くと思うのですが、
それを下記コード2のように書くのは NG でしょうか?
スーパークラスのプライベートインスタンス変数が、
サブクラスのインスタンスからも見えてしまうことに
抵抗を感じ、コード2のように書こうかと考えています。

コード1:
class Base
end

class Derived < Base
end


コード2:
require 'delegate'

class Base
end

class Derived < SimpleDelegator
  def initialize
    super Base.new
  end
end
52デフォルトの名無しさん:2007/08/29(水) 01:51:05
>51
細かく言うと「コード2」は派生でなく委譲やね(書いてあるとおりだが)
もちろん禁じ手でも何でもない。
自分の意図した動きをして、自分の意図がより率直に書けていると思う方を選べばよろし。
ただし、コード2では(書いてあるとおり) DerivedはBaseのサブクラスではないので注意。
53デフォルトの名無しさん:2007/08/29(水) 02:21:11
>52
どもです。
すみません。自分の頭の中を言わずにすっとばしてましたね。
委譲であることは理解しています。
またご指摘頂いたとおりサブクラスではない、
すなわち kind_of が(派生ならば true となるのに)
false になるのも分かっています。

心配なのは次の点です。
SimpleDelegator は method_missing を利用している(…たぶんそう)ので、
委譲先のメソッドを多用する場合、速度面でどのくらい不利になるのか?

上記の該当する想定として
・あるクラスを少しだけ機能追加、機能拡張して使いたい。
・けれども、大抵は拡張前の機能(メソッド)が呼ばれる。
を考えています。

あぁそうか「method_missing ってコストが高いですか?」って
聞けばよかった気がしてきました。すみません。
というわけで method_missing は高くつくものでしょうか?
54デフォルトの名無しさん:2007/08/29(水) 09:59:46
>53
ソース覗いたけど、method_missingは使ってない。
始めにmethodsでオブジェクトのメソッドを洗い出して、
同名のメソッドを委譲先にsendする特異メソッドを自分にevalしてる。
だからコストが高いのはnewの時だと思う。
sendはリフレクションの中では早いほうだったと思う。
55デフォルトの名無しさん:2007/08/29(水) 10:07:16
高くつきます。
問題は、高いかどうかではなく、それが許容範囲かどうかです。スピードが必要であればお勧めしません。
また他にボトルネックがある場合(たとえばDBへの接続とかがボトルネックになっている場合)は、method_missing をなくしたところでアプリケーションは速くなりません。
56デフォルトの名無しさん:2007/08/29(水) 10:27:51
method_missingが高くつくかどうかなんて、
中の処理しだいだと思うのは漏れだけか…?
57デフォルトの名無しさん:2007/08/29(水) 13:09:41
>54
ソースまで見て頂いてしまって恐縮です。
こちらも今、見てみました。確かに new の時に色々やってますね。
今は目的としてインスタンス毎に委譲先を変えたい訳でもなく、
ただ継承と同じことをしたいだけなので。
ただし、 >51 のプライベートインスタンス変数の件を解決した形で。

>55
むむ…そうですか。
method_missing の呼び出しに掛かるコストは
(通常のメソッド呼び出しと)同等程度かと思っていました。
通常のメソッド呼ぶときにもインスタンス内にある
メソッド名のスロット(でいいのかな?)を探して、
あったら呼ぶと思っていたので、
どちらにしてもメソッド名の探索をする時点で似たような
ものかな〜と。
う〜ん…高いのかぁ。どの位違うか測ってみようかな。

>56
すみません。私の書き方が悪かったですよね。
何について高いか知りたかったか、というと
「method_missing の処理が始まって、終わるまで」ではなく、
「method_missing の処理が始まるまで」なのです。


delegate.rb を眺めていたら、
DelegateClass というのもありました。
DelegateClass は(module_eval しているトコの) initialize も短いし、
継承の代わりに使うなら、DelegateClass がいいかもですね。
58デフォルトの名無しさん:2007/08/29(水) 18:36:21
質問です。スレの趣旨から少し外れてしまうかもしれませんが。

RMagickで、Image#thumbnail! を使い、画像を縮小しました。
このインスタンスを a とします。
これをImage#to_blob してActiveRecordに保存し、
そしてそれを Image#from_blob によって再び画像に戻しました。
この取り出したインスタンスを b とします。

この二つが同じものでないのです。
a ... PNG 87x112=>32x32 32x32+0+0 DirectClass 8-bit 16kb
b ... PNG 32x32 32x32+0+0 DirectClass 8-bit 2kb

どうやら a には元のファイルサイズのときの情報などが残っているようです。
a をActiveRecord に保存することなしに、to_blob, from_blob すると、b と
同じものになります。

a に何かメソッドを1つ適用して、元の情報を削除し b と同じものにすることは
できないでしょうか?

http://www.simplesystems.org/RMagick/doc/
アンドゥ情報を削除するメソッドがないか探してみたのですが、うまく見つか
りません。
59デフォルトの名無しさん:2007/08/29(水) 19:24:05
irbで、たとえば何か文字列を返すようなメソッド、

irb> file = File.read('1MB.txt')

とかすると、読み込んだ1メガバイト分のファイル内容がずらーっともう延々と画面上を流れていくんですが、
とってもウザいので何とかしたいです。

 ・ 設定で何とかなる
 ・ 書くときにこういうメソッドを使うと表示はされなくなる

というアドバイスをお願いします。今もまだえんえん流れてます。勘弁して欲しいです。
60デフォルトの名無しさん:2007/08/29(水) 19:50:43
>今もまだえんえん流れてます
ワロタw
61デフォルトの名無しさん:2007/08/29(水) 22:16:23
file = File.read(file) and 1
って付けてみるとか
62デフォルトの名無しさん:2007/08/29(水) 22:32:44
(file = File.read('1MB.txt')).type
とかやってみるとか
63デフォルトの名無しさん:2007/08/30(木) 00:03:40
>>59
(おまけ)長すぎる出力を切り詰める
http://mono.kmc.gr.jp/~yhara/d/?date=20070801#p01
64デフォルトの名無しさん:2007/08/30(木) 00:07:05
カンマの復文で消しゃいいんじゃんね?とおもったら

a = 1, b = 2, c = 3
ってやると期待したとおりにならないんだね。
65デフォルトの名無しさん:2007/08/30(木) 00:31:28
file = File.read('1MB.txt'); nil

まぁ普通は ;nil だな。
mechanize とか使ってるときもコレは必須。
というかmezhanizeとirbの相性の悪さは異常
66デフォルトの名無しさん:2007/08/30(木) 09:34:05
>>59

$ irb --noecho

で起動するか、

~/.irbrc に

IRB.conf[:ECHO] = false

を追記する。
67デフォルトの名無しさん:2007/08/30(木) 11:32:33
使い捨てスクリプト言語のくせにgotoねーのかYO!・・・orz
68デフォルトの名無しさん:2007/08/30(木) 12:14:25
gotoは実装するの面倒だったという話がある

どうしても何らかの理由でジャンプしたいなら catchとthrow か rescueとraise
あるいは ループとbreak/next/retry か メソッド定義とreturn の組み合わせで跳べ

Rubyでも複雑なgoto文プログラムに負けない複雑なプログラムを書くことは可能だ
69デフォルトの名無しさん:2007/08/30(木) 12:21:44
>>67
gotoなんて長らく使っていなければ、gotoが欲しいなんて全く思わなくなるから、
gotoのないプログラミングに早く慣れたほうがいい
70デフォルトの名無しさん:2007/08/30(木) 14:53:28
>>63
~/.irbrcでreturn_formatを指定。

IRB.conf[:PROMPT][:DEFAULT][:RETURN] = "%.100s\n"

100byteまでに切り詰められる。
7159:2007/08/30(木) 15:13:23
昨日のirbが嫌いになりそうだった者です返答感謝です

何かあったときのために>>61>>65を覚えておくことにします
設定は>>70がよいとこ取りでいい感じなので1万バイトに制限してみました
72デフォルトの名無しさん:2007/08/30(木) 16:51:48
1万バイトまではOKなのか。
つっても100x50なら二画面だけだな。
73デフォルトの名無しさん:2007/08/30(木) 17:30:46
数えてみたら8000文字くらいまでは1画面に入りますね
ちょこっと戻るくらいでいいかな、みたいな

むしろこれの恩恵を受けるのはcmd.exe上で使うWindows版irbなのではないかと
74デフォルトの名無しさん:2007/08/30(木) 17:46:35
p (3<=>5) #-1
p (5<=>3) # 1
p (3<=>3) # 0

左辺が大きければ-1
右辺 1
同じ 0

a <=> b
だとaが右辺で、bが左辺なの?
わかんね
75デフォルトの名無しさん:2007/08/30(木) 17:49:38
>>74
何言っちゃってんの?
76デフォルトの名無しさん:2007/08/30(木) 18:42:35
3<=>5は「Integerクラスに属する3のインスタンスメソッド<=>に引数5を渡してる」って読むんだぜ
Stringだとわかりやすい
irb> 'a'.<=>('b')
-1

ということで、selfが大きければ正だ
それ以外の何物でもない
右辺とか左辺とかそーゆーわかりにくい概念無し
77デフォルトの名無しさん:2007/08/30(木) 19:28:29
>>61
自分は場合によっては;nilを付けてる。
78デフォルトの名無しさん:2007/08/30(木) 22:30:31
>>77
何度も言わなくてもわかったって
79デフォルトの名無しさん:2007/08/30(木) 23:26:02
urlを与えると、そこのhtmlソースから
 video/******* (←7桁の数字)
と書いてあるところを見つけて、 ******* を配列@numberに入れてくれるコードを書きたいのですが、
ソース中に出てくる最初の ******* だけしか格納してくれず、
うまくいきません。

かれこれ5時間ほど手詰まりです・・・
どうか助言をお願いいたします。

#! ruby -Ks
require 'open-uri'

class Download_url
def initialize(target_url)
@number = []
@target_url = target_url
html = open(@target_url) do |f|
f.each do |line|
if /video.([0-9]{7})/ =~ line
number.push($1)
end
end
end
end

attr_reader :number
end

urllist = Download_url.new('http://hika5.blog55.fc2.com/blog-entry-92.html')
puts urllist.number
80デフォルトの名無しさん:2007/08/30(木) 23:32:27
一般論として、「HTMLから正規表現reで○○な部分を抜き出して配列に格納」は

arr = html.scan(re).flatten
とか

html.scan(re){
arr.push("url: #{$1}")
}

とか書く

やってみ
81デフォルトの名無しさん:2007/08/31(金) 00:28:28
>>76
あっざーす
レシピの本に右辺左辺って説明があってもやもやしてました
8279:2007/08/31(金) 00:29:56
>>80
あああああ、
できました!!1!

html.scan(re){ ←
arr.push("url: #{$1}")
} ←

の括弧がなかったのが原因でした。
しかしなぜ必要なのかいまいち分からないまま・・・
勉強してきます。

これで今夜はぐっすり寝られそうです。
ありがとうございました!
83デフォルトの名無しさん:2007/08/31(金) 02:12:48
Array#shuffleキボソス
84デフォルトの名無しさん:2007/08/31(金) 04:34:17
>>83
つ 1.9
85デフォルトの名無しさん:2007/08/31(金) 07:43:08
>>83
arr.sort{|x, y| rand(3) - 1 }
86デフォルトの名無しさん:2007/08/31(金) 08:10:50
>>76
> selfが大きければ正
(selfさえわかってれば)めちゃくちゃわかりやすい説明ですな
87デフォルトの名無しさん:2007/08/31(金) 09:43:47
Array#swapだかexchangeの要素の交換ってないの?
88デフォルトの名無しさん:2007/08/31(金) 10:36:22
具体的にどんな動作なのか言ってくれ
○○言語の××、でもいい
89デフォルトの名無しさん:2007/08/31(金) 10:37:08
rubyの言語仕様ってどこにあんの?
どっかにあるらしいのですが・・・
90デフォルトの名無しさん:2007/08/31(金) 10:46:37
ガンダーラといい勝負だな・・・
91デフォルトの名無しさん:2007/08/31(金) 11:04:20
その〜国の名は島根、どこかにあるユートピア。
92デフォルトの名無しさん:2007/08/31(金) 11:05:45
鳥取とかもどこかにある感じだよな
93デフォルトの名無しさん:2007/08/31(金) 11:19:21
取烏の帝都営団高速交通に乗って行けるところにあるらしい
94デフォルトの名無しさん:2007/08/31(金) 13:10:27
>>79
HTMLをスキャンして配列にデータ格納、ってのはあんま initialize に詰め込む処理じゃねーな
作るのに慣れてきたらメソッドに分けることを考えるといいかも
95デフォルトの名無しさん:2007/08/31(金) 23:25:31
標準出力に表示されている文字列を変数に入れるにはどうすればいいのでしょうか?

キーボードから文字を拾うのはあちこちに説明があるのですが、
コンソール画面に表示されている文字を取り込む方法が探しきれません

以前Cの質問スレできいてみたのですが、スルーされてしまったのでこちらで聞いてみました
マルチではないつもりですが気に障ったらスミマセン
96デフォルトの名無しさん:2007/08/31(金) 23:43:10
Cスレで聞いたものをなんでこのRubyスレで聞けるん??

一般論としては既に表示してしまった文字を取り込む方法は無い
普通の表示とは違う表示領域自体を専用に作ってそこに表示しておくとかそういう芸が必要
9795:2007/08/31(金) 23:57:11
>>96
自分にとっては「文字列を取得する」という目的が大事であって
「Cでやる」とか「Rubyでやる」といった手段は二の次だったので

そういった節操の無さがRubistの気に障ったらごめんなさい

そうしますと、shellでバックスペースを押したときに左側の文字が消えるというのは
ものすごく低レベルなところで実装されているということのでしょうか?
98デフォルトの名無しさん:2007/09/01(土) 00:01:26
あれは制御文字\bを表示してるだけだろ
irb> puts "ABCD\bE"
ABCE
9995:2007/09/01(土) 00:14:45
そうですよね。つまり「一度画面に出た文字列を操作した」ということなわけで

だからそういった動きを自分の小さなプログラムでやるのは、高級言語ではやはり無理なのですね…

shellがバックスペースで画面を操作できるのはバッファを管理しているから?

Cursesとかでも触れるのかなと思ったのですが

変な質問に付き合ってくださってありがとうございます
100デフォルトの名無しさん:2007/09/01(土) 01:43:52
>>99
> shellがバックスペースで画面を操作できるのはバッファを管理しているから?
バッファを管理してるのはターミナルエミュレータ。
101デフォルトの名無しさん:2007/09/01(土) 08:41:30
何をしたいのかが全然説明できてない気がするな

15 年前の「パソコン」だったらともかく、現代の環境で、アプリケーションが
「キーボード」を読むのはそれなりに難しいように思うわけだが
102デフォルトの名無しさん:2007/09/01(土) 11:37:52
深い話したいのか浅い話したいのかよくわからんね

ターミナルが表示している文字を取り込むのは面倒だが、
プログラムの中でシェルを起動して目的のプログラムを動かしてその出力を奪うことなら普通にできる
他のプログラムの出力をパイプで最初に流し込むということもできるだろう
103デフォルトの名無しさん:2007/09/01(土) 15:51:10
蛆久氏ね
104デフォルトの名無しさん:2007/09/01(土) 20:03:22
すいません。.irbrcはWindowsの場合どちらにおけばよいでしょうか。
%HOME%に.irbrcをおいてみたのですが読まれないようです。

Windows XP、ActiveScriptRuby 1.8.5
105デフォルトの名無しさん:2007/09/01(土) 20:25:02
ruby -e 'puts ENV["HOME"]'

これで表示されるフォルダに置け
106デフォルトの名無しさん:2007/09/01(土) 20:33:23
.irbrc:
IRB.conf[:PROMPT][:DEFAULT][:RETURN] = "%.100s\n(省略されました・・全てを読むにはここを押してください)\n"

irb> file=File.read('largefile.html')
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n\"http://www.w3.org/TR/html4/loos
(省略されました・・全てを読むにはここを押してください)
irb>

けっこう柔軟だなこの設定
107デフォルトの名無しさん:2007/09/01(土) 21:16:57
蛆久イラネーヨ
108デフォルトの名無しさん:2007/09/01(土) 21:32:21
>>105
なるほど!できました。ありがとうございます。
109デフォルトの名無しさん:2007/09/02(日) 00:30:16
>>106
ここを押したけど続きが読めないんだけど。
110デフォルトの名無しさん:2007/09/02(日) 11:45:20
ruby -e 'puts readlines.reverse'
と似たような動作のUNIXのコマンドってありますか?
111デフォルトの名無しさん:2007/09/02(日) 11:59:55
>>110 tac(1)
俺のFedoraCoreではcoreutilsで入ってる
112デフォルトの名無しさん:2007/09/02(日) 12:16:12
tacだな

わりと昔からあるから、Linuxなら使えるはず
ちなみにFreeBSDには標準では入ってない
113デフォルトの名無しさん:2007/09/02(日) 12:24:13
ありがとう。Cygwinには入ってるみたいだ。
しかしUNIXのコマンド名探しって推論機能が働いたためしがないな・・・w
114デフォルトの名無しさん:2007/09/02(日) 12:47:02
もしかして、catの逆だからtacって名前なの?
115デフォルトの名無しさん:2007/09/02(日) 12:49:25
それ以外に何があるというのか
116デフォルトの名無しさん:2007/09/02(日) 13:03:31
Todai Automatic Computer
117char:2007/09/02(日) 13:27:13
たたたtacん!オルフェノクだよ!
118デフォルトの名無しさん:2007/09/02(日) 22:42:00
catの機能強化版でdogなんてのもあったな
119デフォルトの名無しさん:2007/09/02(日) 23:57:38
>117
洗濯屋乙、てかえらい懐かしいネタを。
120デフォルトの名無しさん:2007/09/03(月) 06:33:01
tacがあるのにdaehがないのはおかしい
121デフォルトの名無しさん:2007/09/03(月) 10:11:11
>>120
かいせつきぼん
122デフォルトの名無しさん:2007/09/03(月) 10:57:22
caseの終了がesacでないのもおかしい
123デフォルトの名無しさん:2007/09/03(月) 11:10:36
>>119
洗濯屋と言われるとケンちゃんしか思いつかない
124デフォルトの名無しさん:2007/09/03(月) 14:31:05
大昔から使ってるHTML収集&生成スクリプトを即っとRSS出力対応にしようとしたら
時間をDateで管理していたらしくTime.httpdateが使えないのでがっかり

これ、なんでTimeじゃなくDateを使ってたんだっけ…?
125デフォルトの名無しさん:2007/09/03(月) 16:36:17
みなさん、CTCは好きですか?
126デフォルトの名無しさん:2007/09/03(月) 16:41:21
初心者スレで聞くこっちゃないねえ
本スレでいじられてきたら
127デフォルトの名無しさん:2007/09/03(月) 18:23:49
委託先がどこがやっても本質的な違いはないというかツッコミどころはそこじゃないんじゃねーのみたいなー
128デフォルトの名無しさん:2007/09/03(月) 19:05:41
つしまね
129デフォルトの名無しさん:2007/09/03(月) 19:49:04
CGIで、GETとPOSTで受け付けたデータを区別したいのですが
調べたらGETもPOSTも区別なく受け取れる…ってことぐらいしか
分かりませんでした。
どうすればいいんでしょうか?
POSTのみ受け付けたいって処理をやりたいのです。
130デフォルトの名無しさん:2007/09/03(月) 20:00:17
>>129
CGI#request_method をチェック。
131デフォルトの名無しさん:2007/09/04(火) 01:57:31
トヨタ、下請けに「中国メーカーと同じ値段で中国よりいい品質」を要求

部品メーカーは、人件費を減らすために工場の人員の半数以上を外国人労働
者に切り替えるよりほかなく、主な生産職は日系南米人や中国人産業研修生
が占めている。日本人の年間給与は400万円程度だが、日系南米人は250万円、
中国人研修生は150万円で採用できる。
http://www.chosunonline.com/article/20070902000014 ;

132デフォルトの名無しさん:2007/09/04(火) 10:27:32
ファイルの最終行から20行程読み込むという作業をおこないたいのですが
ここの方ならどのように書きますか?

ぜひ、スマートな方法をお願いします。
133デフォルトの名無しさん:2007/09/04(火) 10:28:33
tail -n 20
134デフォルトの名無しさん:2007/09/04(火) 10:49:21
>>132
一番のオススメは >133 w
でも、Rubyでやりたいって言うなら

IO.readlines(path).last(20)

が簡単だし解りやすい
けど、やたらバカでかいファイルを読ませたいなら
FileTest.size() 等を元にして後ろから指定バイト読ませたりとか
色々と工夫した方が良いかも知れないな
135132:2007/09/04(火) 10:57:56
>>133
>>134
レスありがとうございます。
Linuxコマンドでしょうか、、?

しょぼいファイルを扱うのでlast()メソッドで十二分に満足です。
ありがとうございました!
136デフォルトの名無しさん:2007/09/04(火) 11:15:15
rubyにqueue, sized queueがないのはおかしい
137デフォルトの名無しさん:2007/09/04(火) 13:03:00
sized queue はともかくとして、 queue は Array の機能でどこらへんが不足なの?
138デフォルトの名無しさん:2007/09/04(火) 13:04:54
要素の追加と削除がO(1)で出来ないところ
139デフォルトの名無しさん:2007/09/04(火) 13:33:08
Array#shiftもArray#pushもO(1)なようだが
140デフォルトの名無しさん:2007/09/04(火) 13:42:06
というかshiftとpopはQueueの機能を再現するためだけに存在するメソッドだろ

require 'thread'

q = Queue.new
th1 = Thread.start do
while e = q.pop
puts e
end
end

['1st', '2nd', '3rd', nil].each{|e|
q.push(e)
}

th1.join
141デフォルトの名無しさん:2007/09/05(水) 08:18:10
ちょっとしたコマンドラインツールの為のアプリケーションフレームワークってないの?
142デフォルトの名無しさん:2007/09/05(水) 11:02:22
>>141
標準添付の OptionParser.rb が若干近いかも

hoge.rb:

require "optparse"
opp = OptionParser.new
opp.on('-a','全部を指定' ){|v| puts '-aオプションが指定されました。' }
opp.on("-i ANIMAL", '動物の名前を入力' ){|v| puts "-iオプションが指定されました。引数は#{v}。" }
opp.on_tail("-h", "--help", 'ヘルプを表示'){puts opp; exit}
opp.parse!(ARGV)

# ----------------

$ ruby ./hoge.rb -a
-aオプションが指定されました。
$ ruby ./hoge.rb -i ねこ -a
-iオプションが指定されました。引数はねこ。
-aオプションが指定されました。
$ ruby ./hoge.rb -help
Usage: hoge [options]
-a 全部を指定
-i ANIMAL 動物の名前を入力
-h, --help ヘルプを表示
143デフォルトの名無しさん:2007/09/05(水) 14:29:48
optparseは中二病のの臭いというか、「Rubyってこんなこともできるんだぜスゲー」の時期に作ったモジュールって感じがする
もうちょっとみんなで落ち着いて考えればもうちょっとは「Rubyらしい」動作になったと思うんだけども
144デフォルトの名無しさん:2007/09/05(水) 14:35:08
じゃあ中年の加齢臭漂うやつを一つお願いします
145デフォルトの名無しさん:2007/09/05(水) 14:36:36
しつもん。

自作クラスやメソッドの使用方法ってみんなどうやって書いてる?
rd形式とかでメソッド定義の先頭に自分でわかる程度につらつら書くとか?
サポートするエディタのモードとかあったりしないのかな。
146デフォルトの名無しさん:2007/09/05(水) 17:55:39
ソースがドキュメント
147デフォルトの名無しさん:2007/09/05(水) 19:39:08
>>143
再設計よろ。
148デフォルトの名無しさん:2007/09/05(水) 21:19:11
rd形式とかでメソッド定義の先頭に自分でわかる程度につらつら
149デフォルトの名無しさん:2007/09/06(木) 00:18:46
Rake Command Completion
http://rake-completion.rubyforge.org/

これをwin32環境でうまく動かせた方はいらっしゃいませんか?

とりあえず、
  tasks = `rake --silent --tasks`.split("\n")[1..-1].map { |line| line.split[1] }

  tasks = `rake.bat --silent --tasks`.split("\n")[1..-1].map { |line| line.split[1] }
に直したのですが、

補完時に、変な^Mがついてしまいます↓
> rake <tab>
clobber^M default^M delete_unnecessary^Mrelease^M

chompとかしてみたんだけどうまくいかず・・・

tasks = File.read(rake_task_cache_filename)
tasks = tasks.map{|s| s.chomp }


環境
rake, version 0.7.3
ruby 1.8.6 (2007-06-07 patchlevel 36) [i386-mswin32]
bash 3.2.15(13)-release
ターミナル Poderosa 3.0.0
150デフォルトの名無しさん:2007/09/06(木) 00:39:59
>>149
まずPedorosaをやめてみる
151デフォルトの名無しさん:2007/09/06(木) 00:40:26
>>149
あとbashも
152デフォルトの名無しさん:2007/09/06(木) 01:03:18
>>141
SimpleConsole は?つかったことないけど。
rails っぽいフレームワークらしい
153デフォルトの名無しさん:2007/09/06(木) 10:51:49
プログラミングRubyのライブラリ編は
rubyのマニュアルに書かれている以上のことは
どれくらい含まれているのでしょうか
基本的に不要ですか?
154デフォルトの名無しさん:2007/09/06(木) 11:12:13
>>149
> bash 3.2.15(13)-release
これはcygwin?

なら\rも取り除かないと。

tasks = `rake.bat --silent --tasks`.split(/\r?\n/)[1..-1].map { |line| line.split[1] }
155デフォルトの名無しさん:2007/09/06(木) 12:49:05
rubyでLispのprognのような一連の式を実行して最後の値を
返すような処理をさせたい場合、どうすればいいのでしょうか?
156デフォルトの名無しさん:2007/09/06(木) 16:59:09
() とか begin end とか。
157149:2007/09/06(木) 19:34:05
おお、レスサンクスー

>>150
orz

>>151
Rake Command Completion は bash用のツールなので、それはないw

>>154
情報足りなかた
bashは、cygwinです。

rubyはwin32だったり、
なんか、混在環境なんだよな・・・

> なら\rも取り除かないと。

試してみるす!!
158デフォルトの名無しさん:2007/09/06(木) 20:37:31
http://www.ruby-lang.org/ja/man/?cmd=view;name=BasicSocket#send
>flags に関しては send(2) を参照してください。
このsend(2)ってどれの事なんでしょうか
159デフォルトの名無しさん:2007/09/06(木) 20:44:13
>>158
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/send.2.html

Linuxとか使ってるなら
$ man 2 send
160デフォルトの名無しさん:2007/09/06(木) 20:45:46
昨今のゆとりはmanの読み方もしらんのか
man 2 send

ttp://www.linux.or.jp/JM/html/LDP_man-pages/man2/send.2.html
を見れ。
161デフォルトの名無しさん:2007/09/06(木) 21:02:33
>manの読み方
マン

ちなみに、manコマンドは
マンコ マンド
162デフォルトの名無しさん:2007/09/06(木) 21:09:21
unix 界隈での慣習として
"名前(セクション)" という形で Unix のマニュアルのセクションにある項目を
示す、ってのがある

man 2 send の 2 は、セクションを指示する引数
163デフォルトの名無しさん:2007/09/06(木) 21:23:57
Windows環境でRuby使ってる人もいるだろうから、突然「send(2)を参照してくれ」
というのはちょっとやさしくないよね。

新しいリファレンスでは改善されてるのかな。
というか、新しいリファレンス大丈夫なのかな。。。
164デフォルトの名無しさん:2007/09/06(木) 21:43:09
もうマニュアルのところにWindowsで使ってる人はまず、端末で format c:と打ってから
Linuxを入れましょうって書いておけばいいよ。
165デフォルトの名無しさん:2007/09/06(木) 23:09:50
時間の計算について質問です。
22:10:56 から 03:01:34 までの時間を計算しようと思い

p Time.mktime(0,0,0,3,1,34) - Time.mktime(0,0,0,22,10,56)

と書いたのですが

in `mktime': argument out of range (ArgumentError)

と出てしまいます。
どこがおかしいのか判らないのですが
どう書けば良いのでしょうか?

また、この計算で日付は使わないのですが
日付は必ず指定しなければならないのでしょうか?

よろしくお願いします。
166デフォルトの名無しさん:2007/09/06(木) 23:16:42
>>165
http://www.ruby-lang.org/ja/man/?cmd=view;name=Time

Time オブジェクトは時刻を起算時からの経過秒数で保持しています。
>起算時は協定世界時(UTC、もしくはその旧称から GMT とも表記されます) の 1970年1月1日午前0時です。

>Time オブジェクトを生成する各メソッドで、それぞれの環境での範囲外の時刻を格納しようとした場合は例外が発生します。
167デフォルトの名無しさん:2007/09/06(木) 23:37:26
>>163
それは無理
Ruby ってどこかしら Unix セントリックなところが Ruby たるところだから
168デフォルトの名無しさん:2007/09/06(木) 23:54:35
WIndowsで使ってる人の方が多いだろうになぁ
169デフォルトの名無しさん:2007/09/07(金) 00:02:24
二分するなら別にそうでもないと思う

でも、Windows用のダウロード数って結構あるんだっけ?
170デフォルトの名無しさん:2007/09/07(金) 09:50:41
>>166
う〜ん…時間の計算は簡単には出来ないのですね。
Timeって時刻を扱うクラスだと思ってたので
これ使えば時間計算もすぐ出来るという考えは甘かったようで。
というか、Timeだけで日付も扱えるならDateの立場って…?

ともかく、ありがとうです。
「どう書けば良いか」は宿題スレの方が適切でしょうか?
171デフォルトの名無しさん:2007/09/07(金) 10:42:33
特定の日付を持たない時間量、7812と2時間10分12秒を相互に変換できるようなものを表すクラスはRubyには無いと思う
引数から分や時を読み取って60や3600をかけるメソッドと
引数の数字を60で割って24の剰余を取って返すようなメソッドを自作するしかないな
(今眠いから剰余だったかどうかはわからん)

あと、Dateは日付だけが必要なもの、たとえば「2007年9月7日」を表すのに使う
Timeだと「2007年9月7日x時x分x秒」という形でしか表せない(0時0分0秒とみなすことはできるが本質的には別)
172デフォルトの名無しさん:2007/09/07(金) 11:56:14
>>163
以前は UNIX のシステムコールの類は全部リンクになってて
リンク先が >>159-162 みたいな説明ページになっていたような気がするんだけど?
173デフォルトの名無しさん:2007/09/07(金) 11:57:43
もうテンプレに
・Windowsユーザーは環境依存の質問・話題を振るのは禁止
って書いとけよ。ウザくてしょうがない。
身の程をわきまえろ。
174デフォルトの名無しさん:2007/09/07(金) 12:06:57
Windowsユーザーですが質問が環境依存であることを判断するにはどうしたらいいんですか(><)!
175デフォルトの名無しさん:2007/09/07(金) 12:09:05
判断しなくても、質問するときに自分の環境として
Rubyのバージョンと使ってるOS書いとけばいいじゃない。
てか、>>1に書いてあるしね。
176デフォルトの名無しさん:2007/09/07(金) 12:26:06
>>175
そうすると「質問を振る」こと自体は避けられないので、
>>173のような中二病が暴れるのは避けられません><
177デフォルトの名無しさん:2007/09/07(金) 12:47:12
Windowsユーザーは>>173より下なんだから仕方がない
178デフォルトの名無しさん:2007/09/07(金) 13:20:51
捨て身の展開にもっていく>>173が居た居たしいです><
179デフォルトの名無しさん:2007/09/07(金) 16:46:19
mingw/msys(w2k)にて

tar zxvf ruby-1.8.6-p36.tar.gz
cd ruby-1.8.6-p36
configure --enable-shared --prefix=/c/msys/1.0/home/ook/app
make
make test
make install

で、/home/ook/appにインストールされてないんですが
.installed.listには
/c/msys/1.0/home/ook/app/bin/
/c/msys/1.0/home/ook/app/lib/
/c/msys/1.0/home/ook/app/lib/ruby/1.8/i386-mingw32/
/c/msys/1.0/home/ook/app/bin/ruby.exe
/c/msys/1.0/home/ook/app/bin/rubyw.exe
/c/msys/1.0/home/ook/app/bin/msvcrt-ruby18.dll
/c/msys/1.0/home/ook/app/lib/libmsvcrt-ruby18.dll.a
/c/msys/1.0/home/ook/app/lib/libmsvcrt-ruby18-static.a
・・・・

とズラズラとログ?が残ってるみたいなんですが、
実際のディレクトリは空のままです。インストールする方法を
教えてくれるとうれしいのですが・・・
180デフォルトの名無しさん:2007/09/07(金) 17:14:14
>>179
--prefix=c:/msys/1.0/home/ook/app
~~
気持ち良くないけど...
181デフォルトの名無しさん:2007/09/07(金) 18:22:30
>>171
とても詳しい説明ありがとうございました。
時刻のみを表わすクラスや、時間量を表わすクラスを自作してみます。
182デフォルトの名無しさん:2007/09/07(金) 18:49:19
>>170
>Timeだけで日付も扱えるならDateの立場って…?

Timeでも可能ではあるけど、1ヵ月後を求めるときはDateの方が楽。

183デフォルトの名無しさん:2007/09/07(金) 18:50:06
Ruby.NETならTimeSpanクラス使えるのにね。
184デフォルトの名無しさん:2007/09/07(金) 18:59:16
それはピュアじゃない。よって地獄に落ちろ。
185デフォルトの名無しさん:2007/09/07(金) 19:19:46
>>179
mingw版のrubyはmsysのpathを解釈できない。

> configure --enable-shared --prefix=/c/msys/1.0/home/ook/app
mingwではそのオプションはどちらも事実上無意味。

> で、/home/ook/appにインストールされてないんですが
C:/c/msys/1.0/home/ook/appにインストールされてるはず。

>>180
configure --prefix=/
make DESTDIR=c:/msys/1.0/home/ook/app
をお薦めする。個人的には。
186158:2007/09/07(金) 19:44:51
>>159-160,162
ありがとうございます!勉強になります。

Windows環境でmswin32版使ってる者でした。
187デフォルトの名無しさん:2007/09/07(金) 23:05:27
rubyなどのオブジェクト指向言語って、
何ができるからいいんですか?
オブジェクト指向だとなにができるんでしょう?
流行に飛びつくかたちで導入したけどもそこがわからないので
すっきりしない・・・
188デフォルトの名無しさん:2007/09/07(金) 23:13:59
オブジェクト指向プログラム言語だと、オブジェクト指向でプログラミングができます!

それ以上でもそれ以下でもないっす
そもそもオブジェクト指向ってのはプログラミング固有の概念じゃない
「なでしこやひまわりだと日本語でプログラムできます!」と同じような感じ
189デフォルトの名無しさん:2007/09/07(金) 23:24:02
>>187
オブジェクト指向なのがうれしいのは他人の作ったライブラリを使うときだよ。

データ型とそれ専用の関数があるわけだからながーいリファレンスマニュアル読まなくてすむじゃん。
しかも、新しいデータ型と関数(クラス)が欲しいけど、一から作るのが面倒なときに
人のものを継承してちょっと変更するだけで望みのものが得られる。

まあ、オブジェクト指向はモジュラー化の進化版だから自分でばりばり書いてれば
そのうちわかるようになるよ。
190デフォルトの名無しさん:2007/09/07(金) 23:27:06
マ板に関連スレいっぱいあるからそっちで聞いておいで
191187:2007/09/07(金) 23:31:03
>>188-189
ごめん
自分の初心者度が上回ってほとんど納得できない;;
手続き型だって関数あるし・・・

Rubyインスコした動機も大学でFortran使って数値計算やってて
その反動みたいなもんなんだ。

>>190
逝ってきます
そもそも自分に必要ないかもしれないけど
192デフォルトの名無しさん:2007/09/07(金) 23:40:07
マ板のスレはマニアさん同士が喧喧諤諤するスレであって、素朴な疑問を解消できる場所でもないような
193デフォルトの名無しさん:2007/09/07(金) 23:42:25
ここでやるなってことだろ。
金曜の夜にするにはあまりにも危険が大きすぎる質問だ。
194デフォルトの名無しさん:2007/09/08(土) 00:23:05
漢数字をアラビア数字にするスクリプトを組んでいるのですが
SHIFT-JISを選択すると十の文字が化ける為に、\で補ってみているのですが上手く動きません。
EUCを選ぶと,premature end of regular expression: /\210・(RegexpError)と出てしまうのですが
どうすればこのエラーを解決できるでしょうか。
195デフォルトの名無しさん:2007/09/08(土) 00:31:02
ここに実際のスクリプト晒さないのは権利条項の制限か何かか?
どうせ動かないんだし権利上も問題なくね?
196デフォルトの名無しさん:2007/09/08(土) 00:32:03
>>194 ソースのコードと -K? を合わせてる?
ソースが SJIS なら -Ks
ソースが EUC なら -Ke
197デフォルトの名無しさん:2007/09/08(土) 15:16:37
arr.each do |num|
method_1(num)
method_2(num,hoge)
method_3(hoge)
if check then
method_4a(num,huga)
else
method_4b(num,hage)
end
end

なんかめんどいから num はインスタンス変数にしてもよしと思う人挙手
198デフォルトの名無しさん:2007/09/08(土) 15:30:39
「別な用途で使いたんだがインスタンス変数に依存してて改造面倒過ぎたので丸々コピペしてほぼ同じメソッド作った」ということがあるので
「引数のカッコが消えるから」という程度の理由ではスコープ上げないことにしてる
199デフォルトの名無しさん:2007/09/08(土) 16:13:52
モジュールMをインクルードした任意のクラスCで、以下のようにMで定義したメソッドをクラスのスコープで呼びたいのですが、どうすればよいですか?

module M
 def hoge
  :hoge
 end
end
class C
 include M
 HOGE = hoge
end
200デフォルトの名無しさん:2007/09/08(土) 16:55:39
クラスもモジュールも書かないでどんどんコード追加してったら手が付けれなくなった
今からクラスにまとめたりするのめんどくさい
コード自体まったくオブジェクト指向じゃない
人に見せられない
おわた
201sage:2007/09/08(土) 18:04:33
a.rbの実行結果を出力させずにhogeに入れたいです、
よい方法があれば教えてください。

#a.rb
p "a"
------
#b.rb
hoge = a.rbの実行結果 "a"
202デフォルトの名無しさん:2007/09/08(土) 18:20:20
#b.rb
hoge = `./a.rb`
puts hoge
203201:2007/09/08(土) 19:16:38
>>202
ありがとうございます
204デフォルトの名無しさん:2007/09/08(土) 22:16:35
質問というか確認させてください。

モジュールM1をインクルードしたクラスC1(メタクラス=C1')
モジュールM2をインクルードしたC1のサブクラスC2(メタクラス=C2')
C2のインスタンスc1(特異クラスc1が生成済み')

というオブジェクト構成のとき、c1が受けたメソッドのコールオーダーは

c1->c1'->C2'->C1'->C2->M2->C1->M1

でいいでしょうか?(表記がわかりにくくてすみません)
205204:2007/09/08(土) 22:52:26
↑頭がこんがらがっていて、滅茶苦茶なことを書いてました!

c1とc1'はそれぞれc2とc2'とするべきだったし、オーダーも本当は

c2'->c2->C2->M2->C1->M1

ですよね。

インスタンスオブジェクト(c2)の特異クラス(c2')は親クラス(C2)のメタクラス
(C2')のサブクラスじゃなくてインスタンスなので、上のコールオーダーに入ってくる
ハズがありませんね。

失礼しました!
206デフォルトの名無しさん:2007/09/09(日) 01:00:04
>>191
Fortranに集中するのが吉
207デフォルトの名無しさん:2007/09/09(日) 01:17:47
>>199
class C
 extend M
end
208デフォルトの名無しさん:2007/09/10(月) 06:17:02
>>199
Mで定義されたメソッドはインスタンスメソッドだから、Cでincludeしたらやっぱりインスタンスメソッドとなっちゃうので、クラスメソッドとしては呼び出せない。
クラスメソッドとして使うにはクラスメソッドとして定義する必要があって、そのためには>>207のようにincludeではなくextendを使う。
http://www.ruby-lang.org/ja/man/?cmd=view;name=Object#extend
または、hogeをmodule functionとして定義する。すると、インスタンスメソッドとしても、(M.hogeという形で)クラスメソッドとしても呼び出せる。
module M
 module_function
 def hoge; :hoge; end
end
class C
 include M
 HOGE = M.hoge
end
http://www.ruby-lang.org/ja/man/?cmd=view;name=Module#module_function
209デフォルトの名無しさん:2007/09/10(月) 08:19:24
rubygemsについて質問なんですけど、gem installすると、たまにインストール
候補が複数出てきて、番号で選ぶ、みたいなのがあるじゃないですか
(例: ruby-sqlite3)

あれを、聞かれて入力するんじゃなくて、コマンドラインで最初から指定する
方法ってありますか?
210デフォルトの名無しさん:2007/09/10(月) 10:11:30
Cで書かれたDLLファイルの扱いについての質問です。
.dllを利用するためにはWIN32APIから呼び出すようですが、
以下のような記述の仕方で簡単に使えるようにするライブラリーはないでしょうか?
意味不明なこといってたらスイマセン。
<例>
dll = Xxx.new('xxx.dll')
dll.hoge()
dll.poge()
211デフォルトの名無しさん:2007/09/10(月) 11:02:41
>>209
gem help install
で見て、なさそうなら
echo 3 | gem install ruby-sqlite3
または
echo 3 > hoge.txt
gem install ruby-sqlite3 < hoge.txt
212デフォルトの名無しさん:2007/09/10(月) 12:21:08
パイプ処理やりダイレクトが動作しない環境もあるかもしれないしな
方法を2種類紹介するのは親切だ
213デフォルトの名無しさん:2007/09/10(月) 12:42:00
個人的には「procカッコイイ」みたいな中二病設定法にみえてヤだ
現代的なプログラムなら素直に引数取れよバカと思うんだが、何かのっぴきならんメリットでもあるんだろうか
214デフォルトの名無しさん:2007/09/10(月) 13:54:04
Rubyって標準のライブラリでグラフの描画ってできますか?
215デフォルトの名無しさん:2007/09/10(月) 14:09:15
>>210
全自動でそれを可能にする仕組みはどこにもない。
Win32APIかdlを使って自分で作ればいいんじゃないか。
216デフォルトの名無しさん:2007/09/10(月) 14:47:38
>>214
そーゆーのはRubyの仕事じゃないしねえ

標準のグラフ描画プログラム(そんなもんがあればだが)をシェルから呼ぶのが妥当かと
いくつか非標準のプロッタに依存したライブラリは公開されてるようだけど
ImageMagick(とGems)が要るGruffとか
217デフォルトの名無しさん:2007/09/11(火) 01:22:59
Rubyどころかプログラミング初心者ですんません。

n = 0.1
puts (n*10)
puts (n*10).to_i
puts (n+n+n+n+n+n+n+n+n+n)
puts (n+n+n+n+n+n+n+n+n+n).to_i
puts (n+n+n+n+n+n+n+n+n+n) == (n*10)

を実行すると、

1.0
1
1.0
0
false

と出力されます。
0.1*10は1なのに、0.1を10回足しても1にならない。
こういうもんなんすかね?

WinXP SP2
ruby 1.8.6 (2007-06-07 patchlevel 36) [i386-mswin32]
218デフォルトの名無しさん:2007/09/11(火) 01:37:03
>>217
浮動小数点数の演算誤差について調べてみるといいかも。
0.1はCPU内部での浮動小数点表現では無理数になってしまう。

n = 0.1
s = 0
10.times do
s += n
end

print "%.20f" % (n * 10)
# 1.00000000000000000000

print "%.20f" % s
# 0.99999999999999989000
219デフォルトの名無しさん:2007/09/11(火) 01:39:37
>217
こういうもんなんすかね、と言われるとこういうもんっすよ、と返すしかなかったりする。
「浮動小数点 誤差」でぐぐってみてくりゃれ。ちなみにRubyに限らないお話。
220219:2007/09/11(火) 01:40:42
……とっととリロードすべきであったな!! > 己
氏のうorz
221デフォルトの名無しさん:2007/09/11(火) 01:42:33
一見同じように見えるが…実は微妙に違う。

$ ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-cygwin]

$ cat test01.rb
n = 0.1
a = n+n+n+n+n+n+n+n+n+n
b = n*10
p a
p a.to_i
p b
p b.to_i
printf "%.15e\n%.15e\n", a, b

$ ruby test01.rb
1.0
0
1.0
1
9.999999999999999e-01
1.000000000000000e+00
222デフォルトの名無しさん:2007/09/11(火) 01:43:05
>220
同士よ…orz
223218:2007/09/11(火) 01:44:14
こうするとさらに分かりやすかったかな。
n = 0.1; s = 0
10.times do
print "%.20f\n" % (s += n)
end

0.10000000000000001000
0.20000000000000001000
0.30000000000000004000
0.40000000000000002000
0.50000000000000000000
0.59999999999999998000
0.69999999999999996000
0.79999999999999993000
0.89999999999999991000
0.99999999999999989000
224218:2007/09/11(火) 01:46:22
>>219,221
乙です。
なんでみんなしてかぶるかな。

そういう自分も二度目の書き込みはリロード確認してなかったり……
225デフォルトの名無しさん:2007/09/11(火) 02:13:27
>>217
require 'rational'

n = Rational(1, 10)
s = Rational(0)
10.times do s += n end
puts s == (n * 10)
226デフォルトの名無しさん:2007/09/11(火) 02:18:59
>>216
諦めてruby上からgnuplotを呼び出してグラフを描きたいと思います。
ありがとうございました。

また質問で悪いのですが、小数点以下の桁数が大きすぎて
gnuplotにデータを送ると、オーバーフローしてしまうので
小数点以下の桁数を指定したいのですが、BigDecimalが思ったように動作してくれず、
Rubyのリファレンスにある任意桁の切り上げ等のメソッドも
定義してからどう使えば良いのか良く分かりません。
ご教授お願いします。
227217:2007/09/11(火) 02:21:36
>>218,219,221
ありがとうございました!
0.1 が厳密には 0.1 ではなかったとは…。

0.10000000000000001000
0.20000000000000001000
0.30000000000000004000
0.40000000000000002000
0.50000000000000000000

0.3までは誤差分が増えてるのに、0.4以降は減少に転じているのが面白いですね。
なぜそうなるのか調べてみます。
228217:2007/09/11(火) 02:31:29
>>225
ありがとうございます!
分数で考えることもできるんですね。
精進します。
229デフォルトの名無しさん:2007/09/11(火) 09:30:48
>>214
グラフを描くライブラリなら、RubyForgeでgraphとかchartとかを検索すればいくつか出てくる。
ttp://scruffy.rubyforge.org/
SVGできれいなグラフを描いてくれる
ttp://rubyforge.org/projects/ruby-gdchart/
GDChart ( ttp://www.fred.net/brv/chart/ ) のラッパー
230デフォルトの名無しさん:2007/09/11(火) 09:41:35
ラッパじゃ意味ないだろ
system()で起動するのとたいして変わらん
231デフォルトの名無しさん:2007/09/11(火) 11:24:15
どうせ初心者だしRubyとビジネスの記事でも読もうぜ

業務用途でRubyを使う上での課題 − @IT
ttp://www.atmarkit.co.jp/news/analysis/200709/10/ruby.html
232デフォルトの名無しさん:2007/09/11(火) 12:40:26
File.openでErrno::ENOENTが出る場合ってどんなの?

ファイルが存在しませんって言われてもそりゃ新たに作るファイルなんだしオープン時点で無いの当たり前じゃん?
233デフォルトの名無しさん:2007/09/11(火) 13:05:28
ファイルがディスク上に存在しなかったらファイルオブジェクト作りにくいだろ…常識的に考えて…

ディスクに問答無用に書き込むだけのメソッドってどっかになかったっけ?
234デフォルトの名無しさん:2007/09/11(火) 13:31:04
自力で rescue Errno::ENOENT したほうがいい
というか、仮にそういう便利メソッドがあったとしても中身は rescue して touch して retry だと思うぞ
235デフォルトの名無しさん:2007/09/11(火) 15:40:38
>>232
新たに作るんなら
open(filename, "w") とか
open(filename, "r+") とか
236デフォルトの名無しさん:2007/09/11(火) 15:47:39
>>213 == 143?
optparseの話か?
procは必要だからこそ使われているわけだが、
「素直に引数取れよ」というのはどういう意味かな?
もうちょっと具体的に。
237デフォルトの名無しさん:2007/09/11(火) 16:07:03
requre "open-uri"
xml = REXML::Document.new(open("http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch?appid=hoge&query=test"))
#↑うまくいかない

xml = REXML::Document.new(open("http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch?appid=hoge&query=test&results=5"))
#↑うまくいく

xml = REXML::Document.new(File.open("hoge.xml"))
#↑うまくいく

RubyでYahooの検索APIを使うスクリプトを組んでいるのですが、
返されるxmlのサイズ?によって出来る時と出来ない時があります。
検索結果を5件など少なめにすれば open-uri で表示できるのですが、
10件などになると表示できません。
まったく同じ xml を hoge.xml として読み込ませると上手くいきます。

いったい何が原因なんでしょうか?
238デフォルトの名無しさん:2007/09/11(火) 16:39:26
RUBYにはCPU使用率を調べるようなクラスはあるのでしょうか?
よろしくお願いします。
239237:2007/09/11(火) 16:49:42
>>237
とか思って、別のサーバにて実行したらできました。
どうやらレンタルサーバ側の設定のせいだと思われます…。

いったいどこらへんに制限をかけているんだろう。
240デフォルトの名無しさん:2007/09/11(火) 16:55:44
>>239
「できない」「できました」だけじゃなくて「どうできなかった」のか、
エラーになったのならエラーメッセージくらいコピペしろ。
241デフォルトの名無しさん:2007/09/11(火) 16:58:37
>>238
名前だけで適当にあげるが
http://raa.ruby-lang.org/project/sys-cpu/ は?
242デフォルトの名無しさん:2007/09/11(火) 16:59:46
一度静的に設定したら2度と変更しない変数を

def initialize
@workdir='/home/ore/hoge/'
@savedir="#{workdir}/save"
@today=Time.now
end

のように設定してます。
変更しないなら定数にしたほうが好ましいですか?
243238:2007/09/11(火) 18:12:04
>>241
激サンクスです!!!

とりあえず、読んでおいしいとこ取りしてみました。
----------------------------------------------------
require 'win32ole'
require 'socket'

def load_avg(cpu_num = 0, host = Socket.gethostname)
 cs = "winmgmts://#{host}/root/cimv2:Win32_Processor='cpu#{cpu_num}'"
 wmi = WIN32OLE.connect(cs)
 wmi.LoadPercentage
end

cs = "winmgmts://#{Socket.gethostname}/root/cimv2:Win32_ComputerSystem='#{Socket.gethostname}'"
wmi = WIN32OLE.connect(cs)
for num in 0..wmi.NumberOfProcessors-1
 puts "cpu#{num}: #{load_avg(num)}"
end
----------------------------------------------------
CPU数が2になるのは謎ですが、色々と楽しめそうです!
244デフォルトの名無しさん:2007/09/11(火) 18:13:42
>>242
その例がインスタンスの初期化ならインスタンス変数で良いと思う。
コード全体としての初期化なら定数だけど、メソッド定義内には書けない。
245デフォルトの名無しさん:2007/09/11(火) 18:22:34
>>230
GDChartはCのライブラリであってコマンドラインから起動するツールじゃないよね。
ライブラリのラッパーがなんでsystemで起動するのと同じなの?
246デフォルトの名無しさん:2007/09/11(火) 20:08:17
>>242
インスタンス生成のときにまで値がわからない可能性があるんだべ?
もしそうならそれでいいと思う。いちおうattr_readerしとけば。
247デフォルトの名無しさん:2007/09/11(火) 20:46:52
保存用ディレクトリ(の共通部)とかは定数でいいと思う
正規表現とかも定数に吐き出したことがあったけど大文字が気持ち悪くてインスタンス変数に戻した
248デフォルトの名無しさん:2007/09/12(水) 20:31:26
可変な配列からはじめの二つを取り除いたものを返すにはどうすればいいでしょう?

array.slice!(2..last) のようなことがしたいです。
array.slice!(0..1) だとはじめの2つだけ返してきます
249デフォルトの名無しさん:2007/09/12(水) 21:25:10
>248
slice! の代わりに slice を使う。
250デフォルトの名無しさん:2007/09/13(木) 00:58:40
>>248
array[2..-1]
251デフォルトの名無しさん:2007/09/13(木) 17:09:48
なんという単語で検索していいかわからなかったので

perl での $a -> ${a} の {}で変数を区別するrubyでの方法を教えて下さい。

system("program", "-f arg1.txt")

のarg1を変数として認識させたいのです。


252デフォルトの名無しさん:2007/09/13(木) 17:24:45
>>251
"-f #{arg1}.txt"
253デフォルトの名無しさん:2007/09/13(木) 20:43:22
>>252
ありがとうございます。

こういうの名前ってあるんでしょうか?
254デフォルトの名無しさん:2007/09/13(木) 20:55:13
Rubyでperldoc -m 相当のことを行うのはどうしたら良いでしょうか?
255デフォルトの名無しさん:2007/09/13(木) 21:11:17
>>253
式展開 でしょうか。
256デフォルトの名無しさん:2007/09/13(木) 21:13:14
>253
式展開

Rubyリファレンスマニュアル → Rubyの文法 → リテラル → 文字列リテラル → 式展開
257デフォルトの名無しさん:2007/09/14(金) 04:51:23
RubyでPostgreSQLに接続するにはどうしたらいいのでしょうか?
OSはWindowsXPを使っています。

ttp://ruby.scripting.ca/postgres/
↑のページのWin32gem用というのを使えばいいのだとは思うのですが、
gemファイルの使い方が分かりません。
(拡張ライブラリを使ったことがありません)

ネット上でも本でも○○.tar.gzのUNIX系のコマンドのものしか見つかりません。
どなたか教えてください。よろしくお願いします。
258デフォルトの名無しさん:2007/09/14(金) 06:06:49
スレちがい
259デフォルトの名無しさん:2007/09/14(金) 10:25:29
呼び出し元のメソッド名を得る方法ってある?
260デフォルトの名無しさん:2007/09/14(金) 13:27:40
caller[0][/in `(.*)'\z/, 1]
261デフォルトの名無しさん:2007/09/14(金) 15:13:10
rubyインストールできません。

intel MacでMac OS X 10.4.10、Xcode2.5でX11環境も入ってます。
MacPortsでport install ruby +universal すると以下のエラーで失敗します。

lipo: can't open input file: /var/tmp//ccXJ6CfM.out (No such file or directory)
make[1]: *** [ruby] Error 1
make: *** [all] Error 2

どうすればいいんでしょうか?
262デフォルトの名無しさん:2007/09/14(金) 15:28:15
>>261
> lipo: can't open input file: /var/tmp//ccXJ6CfM.out (No such file or directory)
/var/tmpはある?
263デフォルトの名無しさん:2007/09/14(金) 16:06:26
>>262
手作業で /opt/local/var以下にtmpディレクトリ作っても失敗しました。長いですけどエラーメッセージつけます。

Error: Target org.macports.build returned: shell command " cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_lang_ruby/work/ruby-1.8.6" && make all " returned error 2
Command output: gcc -I. -I../.. -I../../. -I../.././ext/thread -I/opt/local/include -DUSE_MEM_POOLS -fno-common -O2 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc -fno-common -pipe -fno-common -c thread.c
cc -dynamic -bundle -undefined suppress -flat_namespace -L/opt/local/lib -arch i386 -arch ppc -L"../.." -o ../../.ext/i686-darwin8.10.1/thread.bundle thread.o -lruby -lpthread -ldl -lobjc
/usr/libexec/gcc/powerpc-apple-darwin8/4.0.1/ld: for architecture ppc
/usr/libexec/gcc/powerpc-apple-darwin8/4.0.1/ld: warning -prebind has no effect with -bundle
/usr/libexec/gcc/powerpc-apple-darwin8/4.0.1/ld: warning ../../libruby.dylib cputype (7, architecture i386) does not match cputype (18) for specified -arch flag: ppc (file not loaded)
/usr/libexec/gcc/i686-apple-darwin8/4.0.1/ld: for architecture i386
/usr/libexec/gcc/i686-apple-darwin8/4.0.1/ld: warning multiple definitions of symbol _setregid
../../libruby.dylib(process.o) definition of _setregid
/usr/lib/gcc/i686-apple-darwin8/4.0.1/../../../libpthread.dylib(setregid.So) definition of _setregid
/usr/libexec/gcc/i686-apple-darwin8/4.0.1/ld: warning multiple definitions of symbol _setreuid
../../libruby.dylib(process.o) definition of _setreuid
/usr/lib/gcc/i686-apple-darwin8/4.0.1/../../../libpthread.dylib(setreuid.So) definition of _setreuid
cp ../.././ext/thread/lib/thread.rb ../../.ext/common

264デフォルトの名無しさん:2007/09/14(金) 16:07:11
>>263続き
compiling tk/tkutil
compiling win32ole
compiling zlib
making ruby
gcc -L. -O2 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc -fno-common -pipe -fno-common -DRUBY_EXPORT -L/opt/local/lib -arch i386 -arch ppc main.o -lruby -lpthread -ldl -lobjc -o ruby
/usr/libexec/gcc/powerpc-apple-darwin8/4.0.1/ld: for architecture ppc
/usr/libexec/gcc/powerpc-apple-darwin8/4.0.1/ld: warning ./libruby.dylib cputype (7, architecture i386) does not match cputype (18) for specified -arch flag: ppc (file not loaded)
/usr/libexec/gcc/powerpc-apple-darwin8/4.0.1/ld: warning prebinding disabled because of undefined symbols
/usr/libexec/gcc/powerpc-apple-darwin8/4.0.1/ld: Undefined symbols:
_ruby_init
_ruby_init_stack
_ruby_options
_ruby_run
collect2: ld returned 1 exit status
lipo: can't open input file: /var/tmp//ccxn84U5.out (No such file or directory)
make[1]: *** [ruby] Error 1
make: *** [all] Error 2

265デフォルトの名無しさん:2007/09/14(金) 16:14:32
>>263
/var/tmpがあるかって聞いてるのに、なんで/opt/local/var/tmp作るんだよw

266デフォルトの名無しさん:2007/09/14(金) 16:24:25
>>265
当然あります、最初から。
267デフォルトの名無しさん:2007/09/14(金) 22:09:54
よく分からんが、-archって複数つけていいもんなの?

> /usr/libexec/gcc/powerpc-apple-darwin8/4.0.1/ld: for architecture ppc
> /usr/libexec/gcc/powerpc-apple-darwin8/4.0.1/ld: warning ./libruby.dylib cputype (7, architecture i386) does not match cputype (18) for specified -arch flag: ppc (file not loaded)

ライブラリはi386様なのにppc用のロードモジュールを作ろうとしてる、という風に読めるんだけど。
268デフォルトの名無しさん:2007/09/16(日) 03:13:24
>>261
こっちは問題なくインストールできる。
+universalつけるのやめて、port install ruby でやってみたらどうなる?
269デフォルトの名無しさん:2007/09/16(日) 03:16:53
>>261
>lipo: can't open input file: /var/tmp/

「lipo: can't open input file: /var/tmp/」でぐぐってみると
ttp://peace-pipe.blogspot.com/2006/04/mac-5-vim-mac.html
というページがみつかった。
export CFLAGS="-I/usr/local/include -isysroot /Developer/SDKs/MacOSX10.4u.sdk"
とするといいみたい。
270デフォルトの名無しさん:2007/09/16(日) 16:17:55
>>268
+universal つけないとふつうにインストールできます。
けど出来たバイナリーが Intel用か PowerPC用かわからないんで・・(どっかで見分け方を見た記憶があるんですけど忘れた)
+universalつけてもruby本体以外はちゃんとインストール出来てるんですけどね。

>>261
時間が出来たらやってみます。情報ありがとうございます。
271デフォルトの名無しさん:2007/09/16(日) 16:20:33
ちがった >>261じゃなくて>>269でした。
272デフォルトの名無しさん:2007/09/16(日) 18:22:55
>>270
fileコマンドでわからんか?
273デフォルトの名無しさん:2007/09/16(日) 18:42:43
>>270
>けど出来たバイナリーが Intel用か PowerPC用かわからないんで・・(どっかで見分け方を見た記憶があるんですけど忘れた)
$ file /opt/local/bin/ruby
/opt/local/bin/ruby: Mach-O executable i386

そもそも、Rubyのバイナリやライブラリで、intel用かPPC用か見分ける必要があるのかと。
Foobar.appとは違うんだから。
274デフォルトの名無しさん:2007/09/17(月) 20:47:29
プログラミングまったくわかりません。フローチャートの作法もわかりません。
bshellで目的のコマンドを一定回数繰り返したり、ftpで目的のファイルをgetしてくるオートパイロット
を作ったりして遊んだことはあります。
そんなことをやっているうちにコーディングに興味を持ち始めたんですが、Rubyに手を出してみようと思ってます。

問題はありますか?
やっぱりhttp://www.uni-tech.co.jp/area/nps/
こういうところでC言語から勉強したほうが、Rubyの理解も近道でしょうか?

多くのプログラマが言う「オブジェクト指向」というやつが理解できるのかどうかも不安です。
275デフォルトの名無しさん:2007/09/17(月) 20:53:03
困ってない人を助けられるほどプログラミング言語は優しくない
276デフォルトの名無しさん:2007/09/17(月) 20:55:02
>>274
別に問題ないと思うよ。Cは独学で一番初めにやる言語としては
ちときつい気がするし。

ここなんかが結構参考になると思う。Ruby公式でもチュートリアルとして
リンクが貼られてるし。

http://www1.tf.chiba-u.jp/~shin/tutorial/index.rb


もしかして、仕事にしたいの?
277デフォルトの名無しさん:2007/09/17(月) 21:08:00
>>275
困ってなくても好きなら割となんとかなる
278デフォルトの名無しさん:2007/09/17(月) 21:13:15
>>276
ありがとうございます。
PGを目指すわけではありませんが、まったく知識が無いとちと辛い局面がたまにあるのです。
あと、何かとテキストを加工したり、コマンドオペレーションを自動化したいときに、何かひとつ言語を身につけておくと便利かなぁと。

279デフォルトの名無しさん:2007/09/17(月) 21:14:29
つーか、いきなりRubyから入ったらCが余計にわかりにくくならないか
280デフォルトの名無しさん:2007/09/17(月) 21:38:19
>>278
わからないことはグーグル先生なり質問スレなりに聞けばいいんでない?

>>279
漏れはCやってからRubyやったから、その感覚が残念ながらわからないんだよなあ。
でも、変数だの関数だの条件分岐だのの概念は変わらないから
大丈夫じゃないかな。。
281デフォルトの名無しさん:2007/09/17(月) 22:14:35
資格取りたいかLinuxカーネルハクしたいか業務でC使うプロジェクトに放り込まれたんでもない限り
Cなんて一生使う必要ないよ。やるだけ時間の無駄。

まあ後はRubyで拡張ライブラリ書くときくらいか。
282デフォルトの名無しさん:2007/09/17(月) 22:47:17
Cを使う機会というより、Cをやっていないと他の言語の習得をするにあたって
「本物のプログラマ」にはかなわないと思ってるんじゃないかな
よくオッサンプログラマのボヤキみたいなBLOGで
「最近の若者はCも知らずJAVA JAVAだ」みたいなのは多いから
そういうのを心配してるんでは
283デフォルトの名無しさん:2007/09/17(月) 23:35:12
>>282
それはオッサンのボヤキというより、ブロガーの職場の無能が愛想尽かされてるだけ。
284デフォルトの名無しさん:2007/09/18(火) 00:16:53
>>274はたぶんこういう記事をいくつか読んだんじゃないのか?
これからプログラミングに真摯に取り組もうと考えている奴ほど
こういう声は気になるんだろう

http://local.joelonsoftware.com/mediawiki/index.php/Java%E3%82%B9%E3%82%AF%E3%83%BC%E3%83%AB%E3%81%AE%E5%8D%B1%E9%99%BA
285デフォルトの名無しさん:2007/09/18(火) 00:44:20
__FILE__はどのような方法で行われているのでしょうか?
286デフォルトの名無しさん:2007/09/18(火) 00:53:15
内部的な実装を知りたいということ?
287デフォルトの名無しさん:2007/09/18(火) 00:59:14
>>285
はい、おおざっぱな仕組みでもいいので、この機能とこの機能を組み合わせて
実現しているというのを教えてもらいたいです。
288デフォルトの名無しさん:2007/09/18(火) 02:08:13
パース時にリテラルとして埋め込んでる。
289デフォルトの名無しさん:2007/09/18(火) 04:52:37
rubyインタプリタにcppかますオプションが欲しい今日この頃
290デフォルトの名無しさん:2007/09/18(火) 09:53:08
>>285
そこに興味を持つならソースを読めばいいのに、という気はする。
ソース全体に対して__FILE__でgrepかければすぐわかるよ。

もう286が答えちゃってるけどな。
291デフォルトの名無しさん:2007/09/18(火) 11:52:42
初心者以前の問題だと思うのですが失礼します
公式サイトのチュートリアルの
http://www1.tf.chiba-u.jp/~shin/tutorial/index.rb?Chapter=01
でputs 1+2で3になるそうなんですがなりませんでした
コマンドプロンプトについて調べはしましたが、知識足らずということはあったかも知れません
しかし、コマンドプロンプトはコマンド上で実行するためのもので
実際にファイルをクリックして実行しても結果は変わらないはずだと思うんです
普通に .rb ファイルをクリックしても3という数字は出てきませんでした(プロンプト画面が一瞬でて消えるだけ)
幼稚園児が大人に聞くレベルの質問で申し訳ありませんがよろしくお願いします
292デフォルトの名無しさん:2007/09/18(火) 11:54:55
>>291
本当に初心者以前なので釣りだと思います!
293デフォルトの名無しさん:2007/09/18(火) 11:57:11
一瞬表示されてすぐ終了してるんだよ
ソースの最後に
puts 1+2
gets
とgetsを付け加えてENTERを押したら終了するようにすればいい

あと練習にはirbを使うといいかもね

irb(main):001:0> 1+2
=> 3
irb(main):002:0> puts 1+2
3
=> nil
irb(main):003:0>

こんな感じでいちいちコード書いて保存して実行する手間が省ける
294デフォルトの名無しさん:2007/09/18(火) 11:59:53
.rbファイルを(ダブル)クリックしても実行結果は見えない
…いや、見えてるんだが実際には「起動して表示して終了」が一瞬で行われてて認識できん

コマンドプロンプト上からスクリプトを実行する方法を学ぶべし
295デフォルトの名無しさん:2007/09/18(火) 12:05:19
>>292 残念ながら、釣りじゃないんですorz

>>293 おお、gets入れたら3でました ありがとうございます!
irbってのがよく分かりませんが勉強して参ります

>>294 cd フォルダ名 でファイルがあるディレクトリに移動する必要があるんですよね
こちらももっと勉強してきます
296デフォルトの名無しさん:2007/09/18(火) 12:18:46
すみませんが、質問です。
Rubyには、引数を二つ取る算術関数はデフォルトで存在していますか?
例えばa + b の場合、aがレシーバで、引数はbだけです。
aとbの両方が引数になるような算術関数はあるのでしょうか?

具体的には、1から1000までの和を求めるとして、
(1..000).inject {|x, y| x + y}
この後半のブロックに当たるような関数がデフォルトで存在していたら、いち
いち無名関数を書くことなく、関数名を使ってProcオブジェクトを作れば済む
と思ったのですが。

Haskellだとこんな感じです。
foldl (*) 1 [2 .. 1000]
297296:2007/09/18(火) 12:21:52
すみません、Haskellの例は、正しくはこうです。
foldl (+) 1 [2 .. 1000]
間違えて階乗のサンプルを写してしまいました。
298デフォルトの名無しさん:2007/09/18(火) 12:45:25
>>296
たぶんない
module Enumerable
 def sum
299298:2007/09/18(火) 12:47:40
スマソ、途中で書き込んでしまった

module Enumerable
 def sum
  inject {|a, b| a + b}
 end
end

みたいに一回書いとけば、それ以降は(1..1000).sumだけで和が出せるけどな
300デフォルトの名無しさん:2007/09/18(火) 12:59:30
1.9か、ActiveSupportを使って
(1..1000).inject(&:+)
301デフォルトの名無しさん:2007/09/18(火) 13:07:34
なんかエラーでてる
http://wiki.fdiary.net/rails/?ActiveSupport
302296:2007/09/18(火) 14:24:20
皆さん、ありがとうございます。

>>298-299 標準だとやはりこんな感じですか。

>>300 おお、Symbol#to_proc !
しかも1.9から標準になるのですか!
http://www.ruby-lang.org/ja/man/?cmd=view;name=ruby+1.9+feature#Symbol.23to_proc
これはすごく便利ですね。ActiveSupportは使っているので、これで行きたいと
思います。
それにしても、Rubyはすべてがメソッドで、関数的に書くのはやりづらいと思っ
ていましたが、工夫すればそれっぽい「見掛け」になるもんですねえ。
303デフォルトの名無しさん:2007/09/18(火) 14:41:30
http://www.ruby-lang.org/ja/man/?cmd=view;name=irb

-----
eval "foo = 0"
foo
--
-:2: undefined local variable or method `foo' for #<Object:0x40283118> (NameError)
---
NameError
-----
がエラーになると書いてあるのだけど、
-----
eval "foo = 0"
eval "foo"
-----
だとエラーにならない。

普通のスコープとevalのスコープで振るまいが違うのは不思議に思える。
これについて何か統一的な理解の仕方はある?
304デフォルトの名無しさん:2007/09/18(火) 16:02:36
>>303
暗黙の第二引数となるオブジェクトが存在して、第二引数が指定されない限りそのオブジェクトが毎回引き渡される、と理解すればよい。
305デフォルトの名無しさん:2007/09/18(火) 18:41:08
>>282
「最近の若者は、マシン語も知らず、phpだphpだ」みたいなのが多いのも懸念している人もいます。

shi3zの日記 - マシン語ってどんな感じか知りたくなった方へ
http://d.hatena.ne.jp/shi3z/20070913
306デフォルトの名無しさん:2007/09/18(火) 18:43:23
>>300
横やりなのですが、Railsの本とかサイトみてて、ActiveSupportはこれができてすごいぜ!
みたいなのを、見かけるのですが、いまいち利点がわからんです。

>>296さんの言うみたいに、ブロックなしに関数渡せるよ、ってぐらいなんでしょうか
307デフォルトの名無しさん:2007/09/18(火) 22:19:41
>>303
http://www.ruby-lang.org/ja/man/?cmd=view;name=irb から

> スクリプト全体をコンパイルしてローカル変数を決定するからです.

とあるので、未定義の変数(メソッド)を使おうとしているのをコンパイラが発見して

> undefined local variable or method `foo'

が出力されている。つまりこれはスコープの問題ではない。
308デフォルトの名無しさん:2007/09/19(水) 15:20:11
[1,2,3] [100,101,102] => [101,103,105]
のように二つの配列を受け取ってその各要素の合計を要素とする配列を
得たい場合、Rubyらしく書くにはどうしたらいいのでしょうか?
309デフォルトの名無しさん:2007/09/19(水) 15:40:28
>308
・[1,2,3].zip([100,101,102]).map{|a,b|a+b}
・[[1,2,3],[100,101,102]].transpose.map{|a,b|a+b}
310デフォルトの名無しさん:2007/09/19(水) 22:47:59
↓なんで?

a=[10,1,9,2,8,3,7,4,6,5]
p a.sort { |x,y|
 y<=>x
}
=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

p a.sort do |x,y|
 y<=>x
end
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
311デフォルトの名無しさん:2007/09/19(水) 23:17:28
がーん
312デフォルトの名無しさん:2007/09/19(水) 23:24:02
irb> a = [10,1,9,2,8,3,7,4,6,5]

irb> p a.sort { |x,y| x<=>y }
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

irb> p a.sort { |x,y| y<=>x }
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

irb> p a.sort do |x,y| x<=>y; end
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

irb> p a.sort do |x,y| y<=>x; end
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

ぬう
313デフォルトの名無しさん:2007/09/19(水) 23:24:32
a=[10,1,9,2,8,3,7,4,6,5]
b = a.sort { |x,y| y<=>x }
c = a.sort do |x,y| y<=>x end

p b
p c

=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
314デフォルトの名無しさん:2007/09/19(水) 23:39:52
>>308
re = [ ]
list1 = [1, 2, 3]
list2 = [100, 101, 102]
list1.each_index do |i|
 re << list1[i] + list2[i]
end

要素数が違うときのことはとくに考慮してない

>>310
二つ目の形式だと、do〜endブロックがsortに渡されてない
315デフォルトの名無しさん:2007/09/19(水) 23:48:57
{ } と do end の結合度の違いだな
p() do 〜 end と解釈され p() にブロックが渡されてしまっている
316!= 310:2007/09/20(木) 04:15:33
p a.sort do |x, y| do y<=>x end
では
p a.sort
が先に実行されてまうのはいいとして、p a.sort の結果って nil だよね?
それに do ... end が渡せてしまうのがわからん。
そもそも
(p a.sort) do |x, y| do y<=>x end
と書いたら syntax error になった。
317デフォルトの名無しさん:2007/09/20(木) 05:58:42
>>316 こうゆう事でしょ
p(a.sort) do |x,y|
 y<=>x
end
314,315 が言っているように sort() ではなく p() にブロックとして渡されるが
p() がブロックを処理しない(と思う)ので何も起こらない
318デフォルトの名無しさん:2007/09/20(木) 11:22:17
じゃあ do ... end って何のためにあるの?
319デフォルトの名無しさん:2007/09/20(木) 12:04:03
へ?
320デフォルトの名無しさん:2007/09/20(木) 12:32:50
>>318
まあ可読性の為に使ってる奴が大半(俺含む)だろうが、あえて
open ごにょごにょしてファイル名を割り出す処理() do 〜 end
なんて結合度依存コードとかどうよw
321デフォルトの名無しさん:2007/09/20(木) 12:41:17
>>317
そのとおりでした
さんくす
322デフォルトの名無しさん:2007/09/20(木) 14:02:12
つまりRubyは、パッと見のところだけ美しいだの他言語のいいとこ取りだの言ってるけど、
本質的には美しくも何ともない、行き当たりばったりの糞、ってことでFA?
323デフォルトの名無しさん:2007/09/20(木) 14:06:12
パーザの動きを読むのが難しいんだよな。
書いたコードがどこで区切られ、どういう構造に分解されるかが判りづらい言語。
324デフォルトの名無しさん:2007/09/20(木) 14:45:47
別の目的でそのように書くこともできるというだけであって、普通に書くぶんにはそれほど問題にはならない
perlは記号で呪文のように書くこともできるが、perlはそういう言語というわけでもない
325デフォルトの名無しさん:2007/09/20(木) 15:35:36
少なくとも返り値使う時や一行で書く時は{ ...}を使う
ってことを守ってればいい。
326デフォルトの名無しさん:2007/09/20(木) 16:09:26
手元にあるOHM社のRubyプログラミング入門て本(p196)から引用。
>ブロックの構成に使われる「do…end」と「{…}」の違いは、
>前者のほうが直前の項に対する結合が弱いことです。(略)
> test-doblock.rb
> ------------------------------------------------------------
> def foo(x)
>  puts "foo's block" if block_given?
> end
> def bar
>  puts "bar's block" if block_given?
> end
> foo bar do 1 end #=> foo's block
> foo bar { 1 }   #=> bar's block
> ------------------------------------------------------------
> (略)慣習的にdo…endは、ブロックに手続き的な意味合いを持たせ
> たい時に用い、関数として戻り値を求めたいときは、{…}を使います。
327デフォルトの名無しさん:2007/09/20(木) 23:06:03
俺はブロックではdo-endは使わない。
フロックローカルスコープが導入されるときは{}を使うと決めて、do-endでスコープが
変わらないように気をつけているから。
ブロックローカルスコープのわかりにくさがRubyの欠点の一つだと思っているので。
だから、whileはdo-endだけど、loopやeachは{}で書く。
328デフォルトの名無しさん:2007/09/20(木) 23:09:04
だからっつーか、whileは{}でかけねーだろ
329デフォルトの名無しさん:2007/09/20(木) 23:19:32
漏れはほぼ全部do〜end使ってる。
前田修吾さんのコーディング規約にできるだけ沿ってる
330デフォルトの名無しさん:2007/09/21(金) 00:38:32
1行で済むブロックは{}で複数行のはdo,end使ってる
331デフォルトの名無しさん:2007/09/21(金) 06:20:24
>>327
do-endと{}ってスコープの扱いいっしょじゃないの?
332デフォルトの名無しさん:2007/09/21(金) 08:58:04
おれもおもった
333デフォルトの名無しさん:2007/09/21(金) 09:00:23
どっちか一つにしなさい!
334デフォルトの名無しさん:2007/09/21(金) 09:08:16
なんで?
335デフォルトの名無しさん:2007/09/21(金) 14:15:41
俺は使い分けるの面倒くさいから全部 { } だなぁ
336デフォルトの名無しさん:2007/09/21(金) 16:44:42
質問します。

rubyのプログラムは、メソッドがメインで、それをまとめたり、
扱いやすくするためにクラスや変数がある、と認識しています。

この認識は合っているでしょうか?
337デフォルトの名無しさん:2007/09/21(金) 16:54:01
全然違います
メインとなるものを知りたければオブジェクト指向でぐぐってください
338デフォルトの名無しさん:2007/09/21(金) 17:00:56
てきとーにまとめるのにつかうのはクラスではなくモジュール

まあ、

HogeApp.new.run

で終わってるようなスクリプトも多いけどな
339デフォルトの名無しさん:2007/09/21(金) 17:10:06
336です。

一通り調べたところ、メインとなるものはオブジェクトそのもので、
それを使ってプログラムを組んでいく。そのための補助というか、
プログラムをしやすくするためにクラスや変数やメソッドや
モジュールや配列、ハッシュ(ryがある、と思いました。

ご意見頂ければありがたいです。
340デフォルトの名無しさん:2007/09/21(金) 17:42:28
学校の宿題かなんかか
341デフォルトの名無しさん:2007/09/21(金) 17:47:41
336です。

いえ、来年春に大卒文系でSierに就職する者ですが、就職前の修行のために
しているインターン(就職先とは別の会社)で、「rubyで作られたこの
アプリ(グループウェア)の機能をすぐに付け足せるくらいのレベルに
なって」と言われ、rubyとrailsの勉強をしているところです。

最初はrailsの勉強から入りましたが、わけがわからないのでrubyの勉強
から始め、今に至ります。
342デフォルトの名無しさん:2007/09/21(金) 17:49:33
336です。

なお、見ての通りですが、超がつく未経験です orz
343デフォルトの名無しさん:2007/09/21(金) 17:56:27
習うより慣れろで、プログラムいっぱい書いてるうちに見えてくるかも
344336:2007/09/21(金) 18:02:16
>>343

ですよね・・・。

ruby入門の本は何冊か買ってありますが、本に書いてあるプログラム
をそのままコーディングしてちゃんと動いたのを見届けても、あんまり
楽しくないですし、身になった気もしません。

自分としても一つ自力でプログラムを組みたいのですが、どうすれば
プログラムを組めばいいのかもわからず・・・ orz

ところでrubyの先輩方に質問ですが、何かプログラムを組むとき、
「こういう働きをするメソッドが必要だ」となったとき、そのメソッドは
どうやって探されてるんでしょうか?
345デフォルトの名無しさん:2007/09/21(金) 18:02:52
概念を学んでも意味ないよな
そんなにきっちりした言語でもないし
346デフォルトの名無しさん:2007/09/21(金) 18:09:11
>>344
俺は他言語(Java)から移行してきたんだけど、
リファレンスを勘でクラス名で検索してなんとかなってる
347336:2007/09/21(金) 18:12:48
>>346

すみません、「ruby リファレンス」でぐぐるといくつか出てきましたが、
どのサイトを使われているのか教えて頂けませんか?
348デフォルトの名無しさん:2007/09/21(金) 18:17:13
俺使ってるのはここ
http://www.ruby-lang.org/ja/man/

つか、>>1に書いてあるじゃん
349336:2007/09/21(金) 18:19:10
>>348

あ、確かに。スミマセン。
350336:2007/09/21(金) 18:20:02
>>348

有難う御座いました。
351デフォルトの名無しさん:2007/09/21(金) 18:20:14
Duck Typingだから振る舞い=メソッドが中心で
いいと思った。
352336:2007/09/21(金) 18:27:48
質問、もう一つさせてください。

先輩方は、「こういうプログラムを作ろう」と思ったとき、
どのような流れでプログラムを組んでいくのでしょうか?

自分が考えるには

1 プログラムを構成する一つ一つのプログラムの因果関係や、
処理の流れを決める=アルゴリズムの決定する

2 一つ一つのプログラムを組む。

3 テスト

こういったところでしょうか?
353デフォルトの名無しさん:2007/09/21(金) 18:36:13
一人でやるなら「こういうプログラムを作ろう」ってより、
プログラム書きながらテストしながら考えて、
できあがったものが「そういうプログラム」って感じ
354336:2007/09/21(金) 18:41:17
>>353

なるほど、まさに習うより慣れろなんですね。本読むよりはプログラミング
を実際にして慣れる。「こういうプログラムを作ろう」と考えてから
プログラミングをするよりは、考えながらプログラミングするんですね。
有難う御座いました。


次の質問です。rubyにはメソッドの数がかなりありますが、先輩方
はどうやってメソッドの検索をされてるのでしょうか?

http://www.ruby-lang.org/ja/man/ を見ましたが、メソッドの一覧
などがなかったので、どうやって先輩方はメソッドを検索されてるのかな、
と疑問に思ったので。(よく使っているメソッドは暗記されてると思い
ますが)
355デフォルトの名無しさん:2007/09/21(金) 18:53:15
>>352
エディタと irb 起動。リファレンスも開いておく。

クラスは、とりあえず思い付いた分をエディタで書いて irb にロード。

メソッドは、思い付くまま短いコードを irb で打って試し
「これがよさ気」と思ったらエディタで打ちこむ。
打ち込んだら irb へロードしてメソッドに色々引数渡して試す。

んなことを何度か繰り返した後、irb を終了し ruby に渡して実行。

RubyUnitとかは使ったこと無いが、使えると楽なのかも。
356336:2007/09/21(金) 19:03:16
>>355

irbというのもあるのですね。知りませんでした。

ruby script/console のようなものでしょうか。
357デフォルトの名無しさん:2007/09/21(金) 19:11:17
>>352
1 とりあえず中身は空のただ実行できるだけのミニマムなプログラムを作る
2 何行か必要そうなコードを書いてみる。
3 動かしてみて、あと何が足りないかを考える。
4 満足するまで2に戻る。
358336:2007/09/21(金) 19:14:40
>>357

人によってそれぞれプログラミングの方法は様々なんですね・・・。
勉強になります。
359336:2007/09/21(金) 19:32:22
埋もれてしまっているので、もう一度書きます。

次の質問です。rubyにはメソッドの数がかなりありますが、先輩方
はどうやってメソッドの検索をされてるのでしょうか?

http://www.ruby-lang.org/ja/man/ を見ましたが、メソッドの一覧
などがなかったので、どうやって先輩方はメソッドを検索されてるのかな、
と疑問に思ったので。(よく使っているメソッドは暗記されてると思い
ますが)
360デフォルトの名無しさん:2007/09/21(金) 19:49:11
>>359
リファレンスをとりあえず全部読む。
その時点でメソッドを暗記する必要はなくて「どっかこのあたりにこんなことが書いてあったような」という程度の記憶が得られればいい。
あとは必要になったときにその記憶を頼りにしてリファレンスを見直すだけ。

というかさ、プログラミングとか関係なく、本(小説じゃなくて実用書)を読んだりする時もそんなもんじゃね?
361336:2007/09/21(金) 19:53:37
>>360

なるほど、リファレンスを一通り読んでからは、あとはケースバイケース
でメソッドを探していくんですね。

有難う御座います。
362デフォルトの名無しさん:2007/09/21(金) 20:11:36
前もどっかで書いたけど、Webサイトのマニュアルは鯖負荷が上がるので読まない
何らかの手段でローカルでアーカイブしてくれてるものを普通ありがたく使う(HTMLヘルプ版とか)

クラスとメソッドは、ArrayとEnumerableとStringとHashの4つは常に眺めておく
何か面白そうなのないかなーと普段から眺めておくと、使いたいときにひらめく
…まあ、このへんはたのしいRuby第2版あたりの入門書籍読むのでもいいんだけどさ

他のクラスやメソッドはGoogleで適当に検索すると適当な使い方をしてるブログやサイトが引っかかる
363336:2007/09/21(金) 20:16:04
>>362

ああ、そういえば買ったのに「たのしいruby」を放置してました (汗)

なるほど、手段は色々あるんですね。勉強になりました。みなさん、
有難う御座います。また来ます ノシ
364デフォルトの名無しさん:2007/09/21(金) 21:40:43
こういうときのために、るびまの『Rubyの歩き方』があるんじゃないか。
http://jp.rubyist.net/magazine/?FirstStepRuby
でもこれにはリファレンス参照用ツールとしてriとrefeが紹介されているけど、初心者のことを考えると
『Windowsユーザの場合はchmファイルを開いて検索しましょう』と書いておくべきだよな。

>>359
というわけで、Windowsユーザなら
http://elbereth-hp.hp.infoseek.co.jp/files/ruby/refm/ruby-refm-rdp-1.9.0-ja-htmlhelp.zip
をダウンロードして検索するのがいちばん楽。
365デフォルトの名無しさん:2007/09/21(金) 21:53:57
>>364
> でもこれにはリファレンス参照用ツールとしてriとrefeが紹介されているけど、初心者のことを考えると
> 『Windowsユーザの場合はchmファイルを開いて検索しましょう』と書いておくべきだよな。

編集部にフィードバックしたってください
366327:2007/09/21(金) 23:24:18
>>331
ブロックで使う場合は一緒。
だけど、同じdo-endでも制御構造であるwhileの場合はスコープを作らない。
ほか、doでは始まらないけど、if-endやcase-endやbegin-endも一緒。
なので、XX-endはスコープを作らないものにだけ使用し、見た目だけででスコープが
判断できるようにしたかったので、必ずスコープを導入してしまうブロックではdo-endを
つかわないように自分のコーディングスタイルとして決めた。ということを>>327では言い
たかった。なので、

>>328
だからっつーか、whileは{}でかけねーだろ

ってのは俺から見れば的外れな指摘だったのだが、今読み返してみると、>>372
そこまで理解できるやつはエスパーだわ。
367デフォルトの名無しさん:2007/09/22(土) 00:15:23
>>327をみたときはバカかと思ったけど>>366で見直した。
368デフォルトの名無しさん:2007/09/22(土) 00:49:25
whileやuntilのdoは省略すると決める
ルールでも出来るな>見た目でスコープの有無
369デフォルトの名無しさん:2007/09/22(土) 01:08:57
いや、なんつーか、こういうブロックでスコープが被って本当に困るのか?

そんなにまでおまえら変数名を使いまわししてんのか?
370デフォルトの名無しさん:2007/09/22(土) 01:55:57
>いや、なんつーか、こういうブロックでスコープが被って本当に困るのか?
なにいってんのお前?
「こういうブロックでスコープが被って」?スコープが被るって何だよ。
意味不明なこというな。

>そんなにまでおまえら変数名を使いまわししてんのか?
はぁ?変数の使いまわしと何の関係があんの?
371デフォルトの名無しさん:2007/09/22(土) 02:09:29
初心者スレで煽り叩きはみっともない
372デフォルトの名無しさん:2007/09/22(土) 05:15:30
まぁ、どこでやってもあんまり見栄えのするもんじゃないよな。
373デフォルトの名無しさん:2007/09/22(土) 20:13:28
vrubyってクラシックな視覚スタイルしか作れないのですか?

無いとしたら、今後XP(Luna)やVista(Aero)の対応予定とかありませんか?
374デフォルトの名無しさん:2007/09/23(日) 01:06:45
375デフォルトの名無しさん:2007/09/23(日) 02:34:59
>>359
「Rubyレシピブック」も必携だと思う。
いつもこれをちらちら見ながらコード書いてます。
376デフォルトの名無しさん:2007/09/23(日) 13:01:42
>>369
困るのは変数の名前が被ることじゃないだろ

とエスパーを試みる
377デフォルトの名無しさん:2007/09/24(月) 04:48:04
% ls -l */*/*/*/*/*/*/*/*/*
sh: /bin/ls: Argument list too long
って言われましたが、ルビーなら階層深くてもおk?
378デフォルトの名無しさん:2007/09/24(月) 05:13:09
シェルが出してるから無理だろ

というか ls -R や ls -R1 や find . -print では何か不足?
379デフォルトの名無しさん:2007/09/24(月) 06:13:14
dirs = Dir.glob("*/*/*/*/*/*/*/*/*")
puts dirs.sort
とすれば、シェルの制限を回避できるんじゃね?
380デフォルトの名無しさん:2007/09/24(月) 10:00:23
レシピブックは糞だから間違っても買わないように
381デフォルトの名無しさん:2007/09/24(月) 10:04:02
なんだ、まだ恨んでんのか
382デフォルトの名無しさん:2007/09/24(月) 10:47:00
Rubyは死にゆく運命にある言語だからあまり入れ込まないように
383デフォルトの名無しさん:2007/09/24(月) 14:23:43
なんか便利な感じの「ひらがなだけマッチする正規表現」とか「2バイト文字だけ正規表現」とかの定数って
標準のどっかで定義されてたりしません?
384デフォルトの名無しさん:2007/09/25(火) 00:03:39
日本人のための言語じゃないからねえ。
自分で実装したら?
385デフォルトの名無しさん:2007/09/25(火) 02:03:21
ある値が数値かどうか判別するにはRubyではどうするのでしょうか?
386デフォルトの名無しさん:2007/09/25(火) 02:39:48
ある値.kind_of? Numeric
387デフォルトの名無しさん:2007/09/25(火) 03:27:30
個人的なものならむしろ Integer() してしまう俺
388デフォルトの名無しさん:2007/09/25(火) 03:29:54
整数になっちゃうじゃん
389デフォルトの名無しさん:2007/09/25(火) 04:51:43
ああ「数値」かw じゃ Float()
型チェックより変換しちゃう方が性に合うんだよな〜
390デフォルトの名無しさん:2007/09/25(火) 07:38:05
浮動小数点数になっちゃうじゃん
391デフォルトの名無しさん:2007/09/25(火) 07:58:51
ある文字列が数値かってことじゃないの?
正規表現でチェックできると思うけど。
392385:2007/09/25(火) 10:17:10
自分がやりたかった処理はkindofでできそうです。ありがとうございました。
ところで手元のピッケル本を見るとinstance_of?やkind_of?の引数の
部分にclassではなくklassと書かれてるんですが、これは何か意味があるんでしょうか?
393デフォルトの名無しさん:2007/09/25(火) 10:44:35
>>392
classは予約語だから変数名として使えない。かわりにklassを使っている。ただそれだけ。
394デフォルトの名無しさん:2007/09/25(火) 11:58:05
hash[key] += 1
をキーが無い時にやると undefined method `+' for nil:NilClass って怒られるんだけど、例えば値のデフォルトをFixnumにして怒られないようにすることはできるのでしょうか?
395デフォルトの名無しさん:2007/09/25(火) 12:10:21
>>394
hash = Hash.new(0)

詳しくはマニュアルのHashのページのデフォルト値関連を読む。
396デフォルトの名無しさん:2007/09/25(火) 12:16:41
>>383
onigurumaにはあるからruby 1.9以降では使えるかも。
試してないけど。
397394:2007/09/25(火) 13:01:01
>>395
ありがとう。さすがRuby。
398デフォルトの名無しさん:2007/09/25(火) 13:10:45
SQLite3をJRubyから利用したいのですが、
"no driver for sqlite3 found"となってしまいます。
いろいろな場所に、sqlite3.dllやsqlite3_api.dllを配置して試しているのですが変化ありません。

同じソースでrubyから実行した場合は、
dllをロードしてテーブル操作もできます。
また、sqlite3を使用しないでJRubyから呼んだ場合もエラーにはなりません。

DLLの配置場所や指定方法の問題と思っているのですが
なにかチェックした方がよい点などわかりますでしょうか?
どこかにドキュメントなどがあればその場所でもよいです。







ActiveRecordを利用して

require 'active_record'
require 'sqlite3'
399デフォルトの名無しさん:2007/09/25(火) 13:17:29
どーでもいいことだが、変数名にhashは使わんほうがいい。
400デフォルトの名無しさん:2007/09/25(火) 14:39:56
>>398
そのDLLはJavaから使えるやつ?
401398:2007/09/25(火) 15:10:59
>>400
Javaから呼ぶ場合のDLLが違う場合があるということですか?
今まで気にしなかったので、使えるのかどうか不明です。
どこを参照すればわかるのでしょうか?

ruby.exeをコマンドプロンプトから起動した場合に
使用するDLLと同一なものを使えると思っていました。


402デフォルトの名無しさん:2007/09/25(火) 16:06:18
>>399
釣りはアンチスレがあるんでそっちで

300歩譲っても質問スレでオリジナリティのある変数名にする理由を思いつかん
403デフォルトの名無しさん:2007/09/25(火) 16:46:20
今日の年月日のディレクトリに適度な名前のファイルを作成してtextを書き込みます。
今日のディレクトリは最初はありませんが、プログラムの使われ方によっては既にあることもあります。

その1

Dir.mkdir(todaydir) unless FileTest.directory?(todaydir)
File.open("#{todaydir}/hoge.txt",'w'){|f| f.write(text)}

その2

begin
File.open("#{todaydir}/hoge.txt",'w'){|f| f.write(text)}
rescue Errno::ENOENT
Dir.mkdir(todaydir)
retry
end

ぶっちゃけ趣味適当運用上は大差ないとも思うんですが、
毎日例外出してrescueしてretryはなんか違う気がするので
その1がいいような気がします。どんなもんでしょうか。
404デフォルトの名無しさん:2007/09/25(火) 17:52:51
>>403
普通は1かと。
405デフォルトの名無しさん:2007/09/25(火) 18:10:55
使える関数や危険な操作を制限してユーザから入力されたコードを実行したいのですが、
どのようなやり方が適しているでしょうか?
406デフォルトの名無しさん:2007/09/25(火) 18:23:06
>>405
ラッパーを作る

ユーザーに生Rubyスクリプトコードを入力させる場合の運用ポリシーは2つしかない
全部許すか、そんなこと一切させないか、どっちか
407デフォルトの名無しさん:2007/09/25(火) 18:42:26
>>405
$SAFE = 4
408デフォルトの名無しさん:2007/09/25(火) 18:49:42
>>407
そんなものを信じていると、きっと後悔することになります
409398:2007/09/25(火) 18:58:09
JRubyからsqlite3を使用

require 'sqlite3'
db = SQLite3::Database.new("data.db")

#<RuntimeError: no driver for sqlite3 found>
ってなる

rubyで実行するとエラーにならない
410デフォルトの名無しさん:2007/09/25(火) 19:50:16
>>402
おいおい。なんでアンチ?

Objectクラスにhashというメソッドがあって(つまり全クラスにあって)
それとかぶるからhashという変数名は使わないほうが良いよってだけじゃ
ないかな。実際、使って困ることはまずないけど。
411デフォルトの名無しさん:2007/09/25(火) 19:55:54
名前がなんでもいいときは、aHash とかにするといいんだぜ?
412デフォルトの名無しさん:2007/09/25(火) 20:45:45
hashだとケアレスミスに気づきにくくなる。特に初心者の場合。

http://d.hatena.ne.jp/rubyco/20070123/error
413デフォルトの名無しさん:2007/09/25(火) 22:27:23
>>409
そりゃそうだ。JRubyからCRuby用の拡張ライブラリは呼べない。
SQLite の JDBC ドライバを持ってきてそれを使えばいいんじゃね。
414デフォルトの名無しさん:2007/09/26(水) 01:07:15
webrick/httpproxyでuseragentなどHTTP_HEADERを変更する方法ってどのようにするのでしょうか?
415デフォルトの名無しさん:2007/09/26(水) 07:58:10
416デフォルトの名無しさん:2007/09/26(水) 10:43:54
>>413
JRubyからactive_recordは使えないのですか?
417デフォルトの名無しさん:2007/09/26(水) 12:14:24
>>411
Ruby で変数やメソッド名に camelCase 使うのって好きじゃないんだよな…
というか、aHash というつづり自体が

  アハーッシュ♥

という感じでバカっぽい
何も考えてないハッシュです、という意思表明には h が無難なのかね
418394:2007/09/26(水) 14:02:33
変数がハッシュだよというためだけにhashって書いたのに...

Arrayでも同じなんだろうなと思ったら、size指定した範囲しかデフォルト値与えられないジャン。
中途ハンパだなぁ。
419デフォルトの名無しさん:2007/09/26(水) 15:38:20
large_range.include?(small_range) が (俺の) 思った通りの動作をしてくれなくてはまった。

リファレンスマニュアルの見出しには、

self === other
include?(other) (ruby 1.7 feature)

とあるんだけど、
other だと self と同じクラスのインスタンスを想像してしまうので、
other じゃなくて item とかの方が良いように思う。
420デフォルトの名無しさん:2007/09/26(水) 15:40:20
>>418
Perl のスレで、コード例の変数に $a や $b を使うと怒られるのに似てるな。> hash
421デフォルトの名無しさん:2007/09/26(水) 16:43:46
>>418
まーでも、そのコードをコピペして動かそうとしたときに
誤動作が起こる可能性があるから、やっぱり変数名にhashは止めたほうがいいと思う

>>420
それとは別だろう
hashという名前の関数(Kernelメソッド)があるから指摘されたわけで
422394:2007/09/26(水) 17:15:37
>>421
hashは使わないようにするけど、そのKernelメソッドってのがわけわからんわ
オブジェクトなしで呼び出せるメソッド=Kernelメソッド=Objectクラスのメソッドで合ってる?
副作用があるなら予約語にするべきなんじゃないの?
423デフォルトの名無しさん:2007/09/26(水) 17:55:26
せめてリファレンス読め
424デフォルトの名無しさん:2007/09/26(水) 18:36:41
>>422
当面はその理解でいい。
425デフォルトの名無しさん:2007/09/26(水) 18:54:35
当面って...
組み込み関数+Objectクラスのメソッドとしか読み取れない
426デフォルトの名無しさん:2007/09/26(水) 20:11:08
>>416
あれ?ActiveRecord-JDBCって使えないの?って思ったら未サポートらしいですね。
http://jruby-extras.rubyforge.org/ActiveRecord-JDBC/
427デフォルトの名無しさん:2007/09/26(水) 22:33:48
>>421
いや、perl で $a, $b は特別な意味があるんで。
428デフォルトの名無しさん:2007/09/26(水) 22:41:13
>>427
でた、Perlのバッドノウハウ
ほんといけてないよなPerlは
429デフォルトの名無しさん:2007/09/27(木) 00:28:00
>>428
なんという目糞鼻糞
430デフォルトの名無しさん:2007/09/27(木) 00:35:38
>>427
ねーだろwww
431デフォルトの名無しさん:2007/09/27(木) 00:41:50
>>430
sortの中で、$aと$bに比較対象が渡されてきたような気がする。
432420:2007/09/27(木) 01:03:53
意外と知られてないのかな・・・
433デフォルトの名無しさん:2007/09/27(木) 02:29:00
Perl関連のスレでは何度か出てる話だよね。
一部の組み込み関数を呼ぶ際に $a と $b を使うから
$a と $b はそれ以外の目的で使わない方がいいって話。
434デフォルトの名無しさん:2007/09/27(木) 06:58:43
>>433
sortに、比較関数をわたすことができるんだけど、そのときにmyなしでいきなり$aと$bを使えるようになっている。というか$aと$bを使うようになっている。
これを知らないと、use strictしても、myなしの$aと$bがエラーにならず、はまる。
まさにバッドノウハウ。
ほんといけてないよなPerlは
435デフォルトの名無しさん:2007/09/27(木) 08:57:31
バッドノウハウという言葉の使い方が間違ってると思われる件
436デフォルトの名無しさん:2007/09/27(木) 09:48:24
>>435
使ってみたいお年頃なんだろう
437デフォルトの名無しさん:2007/09/27(木) 10:56:37
>>434
バグと言っていいレベルの仕様だな。
当然,Perl6では直ってくると期待。
Ruby2.0レベルに期待しておく。
438420:2007/09/27(木) 12:07:18
「バッドノウハウ」とか言い捨てるのは勝手なんだけど、
use strict すらなかった昔の仕様の後方互換性を保つためにそれだけ配慮してる、
という見方もできるんじゃないかな。

後方互換性を取れば「バッドノウハウ」と言われ、
バッドノウハウを排除すれば「後方互換性を考えてない」と言われ、
言語を作るとはかくも辛い仕事なのだなあと思ってみたり。
439デフォルトの名無しさん:2007/09/27(木) 12:17:06
Perlは$a、$bだけだけど、Rubyはhash以外にも山ほどあるってことでRubyの負け。
440デフォルトの名無しさん:2007/09/27(木) 13:31:16
>>439
変数名とメソッド名の見分けが付かないのが敗因だな。
やっぱり変数名は $ で(ry
441デフォルトの名無しさん:2007/09/27(木) 13:43:04
ruby on railsを先日から趣味でいじり始めました。has_manyを使って

class A < ActiveRecord::Base
 has_many :B
end
class B < ActiveRecord::Base
 belongs_to :A
end

としてA,Bを関連付け後にBをcreateしたらうまくAのidで作成できました。
それを表示しようと

b = a.b.find(:all)

とすると複数のオブジェクトが取得できたので(a.b.count=2)それを表示
しようとfor文で回してみようとしたところundefined method `each'
のエラーになってしまいます。
has_manyを利用しないような場合はfind(:all)で取得後普通にfor
で回して表示できますが・・・何か理解が足りないのでしょうか?
442デフォルトの名無しさん:2007/09/27(木) 13:44:38
メソッドや変数を特別扱いする意味がわかりません
全部オブジェクトへの名札にしか過ぎないのに

# 変数名と被るからってメソッド名の前に動詞追加するチキン行為禁止
443デフォルトの名無しさん:2007/09/27(木) 13:54:07
>>442
>全部オブジェクトへの名札にしか過ぎないのに
それは言語実行側の目線

プログラムを作る側としては、
ロジック(メソッド)とデータ(変数)は別物として扱う。
変数に、メソッドへの参照が突っ込めれば便利だけど
区別はしたいと思っている。
444デフォルトの名無しさん:2007/09/27(木) 14:21:11
そんなマジレスされてもみんな困ると思うぞ
445デフォルトの名無しさん:2007/09/27(木) 19:23:42
>>441
logger.debug b.inspect
または
logger.debug b.class.name
として、bが何か調べよう。
446デフォルトの名無しさん:2007/09/27(木) 20:59:52
ruby -rtracer a.rb
でトレースできるのはうれしいんだけど、
メソッド名だけが出てくるようなオプションはないすか?
例外のスタックトレースみたいなやつ
447デフォルトの名無しさん:2007/09/28(金) 04:59:26
あります
448デフォルトの名無しさん:2007/09/28(金) 15:28:21
phpでいうところのmb_substr(perlのsubstrのマルチバイト版)
みたいなのはいろいろ手を加えないとできないのでしょうか?
スクリプトコードはutf-8にしているのですが文字列で扱う方法が
分からなくて困っています。
449デフォルトの名無しさん:2007/09/28(金) 15:47:16
str.split(//u)[idx, len]
とか。
1.8までだとこれぐらいじゃないか
450448:2007/09/28(金) 15:58:49
なるほど、splitでunicode化ですね
ただこれだとめっちゃ遅くなるんで特化したのはないのかなぁと

1.9だとまた事情かわるんでしょうかねえ
451デフォルトの名無しさん:2007/09/28(金) 16:04:33
そもそもそれはsubstrを使う必要のある処理なのか?
もっと簡単なメソッドで代用できるのならそっちの方がいいよ
452448:2007/09/28(金) 16:17:28
特に困っているっていう記事はぐぐっても見あたらなかったので
あまり皆さんはマルチバイト意識したsubstr使わないんでしょうかねえ…

Perlでも力業をつかえばできなくないのですが、
スクリプトベースで遅いのが難点なので
rubyはこの辺なんとかなっているのかなと思った次第です

1.9のm17n化ってのがそれっぽいのかな?
バイト単位を文字単位でってやつですね
453デフォルトの名無しさん:2007/09/28(金) 20:59:18
scan split sub gsubで事足りてるからなあ。
454デフォルトの名無しさん:2007/09/29(土) 06:47:58
>>452
割と普通に困ってる。
ふと気を抜いて使うとももろボトルネックだし。
utf8くらい自由に扱えるようにしてほしい。
455デフォルトの名無しさん:2007/09/29(土) 12:04:28
C言語なんかじゃ、文字列処理が弱すぎるせいでsubstrを使うことはあるが、
Rubyとかの文字列処理が強い言語で、substrという原始的な関数を使う場面があまり無いと思う。
456デフォルトの名無しさん:2007/09/29(土) 13:21:59
他の言語で○○を使っているのでRubyでも「使わないといけない」という論調はよく見るな

具体的にどういう処理をさせたいのか話してくれれば自分で下手な処理書くよりもベターな案があるかも
457デフォルトの名無しさん:2007/09/29(土) 18:27:38
同じ機能がなくても同じ結果は生み出せるだろうからね。
458デフォルトの名無しさん:2007/09/29(土) 21:01:23
BASICみたいにLEFT/RIGHT/MIDで何でもやってしまう人よりはマシ
459デフォルトの名無しさん:2007/09/30(日) 04:04:06
PやRだと何でも正規表現でやりたくなるな
460デフォルトの名無しさん:2007/09/30(日) 12:48:12
RSpecとかよくわからん
実際具体的にはどういう風にスクリプト作っていけばいいんだ?
461デフォルトの名無しさん:2007/09/30(日) 13:45:52
>>460
るびま21号読んだ? かなり具体的に書いてある

俺も今RSpecを使ってやってるけど、コツを人に説明するのは難しいな
「こんなライブラリ/アプリを作りたい」というのがあればアドバイスできるかも
462デフォルトの名無しさん:2007/09/30(日) 15:12:38
すみません。おそらくとんでもない罠を見落としてるんだと思うんですが
ちょっとすぐには解決できそうにないので質問させてください

http://toku.xdisc.net/cgi/up/vcc/nm10948.txt.html
↑のスクリプトなんですが、なぜか1つだけ正規表現にマッチしないのです
何が悪いのでしょうか?

環境はWindows 2000 ActiveScriptRuby 1.8.637 RDE上で実行しています
463デフォルトの名無しさん:2007/09/30(日) 15:25:44
464デフォルトの名無しさん:2007/09/30(日) 15:25:54
>>462
漏れもどこがおかしいのかしばらくわからなかったw

http://72.14.253.104
        ~~~~~

ひとつだけ253
465462:2007/09/30(日) 15:43:32
レスありがとうございます。こんなはずかしい罠にはまってたとは…トホホ

しかしGoogleさん面倒なことしてくれるなぁ
72.14.192.0/18 で振り分けるにはちょいとデカすぎる気がするし
これ全部キャッシュサーバーならいいんだけど…どうしたものやら…
466デフォルトの名無しさん:2007/09/30(日) 17:00:24
外付けHDDなどにruby本体をいれ
インストールされていない環境で動かしたいのですが可能でしょうか?
467デフォルトの名無しさん:2007/09/30(日) 17:09:53
mswin版のzipのヤツは実際にUSBメモリ入れたまま直接動かしたことがある。
問題はなかった。元々解凍してそのまま使えるんだから当然か。
468466:2007/09/30(日) 17:15:48
PATHを通すことができなければ動かないですよね?
469デフォルトの名無しさん:2007/09/30(日) 17:23:16
>>466
基本的にPATHさえ通せれば問題はない
NYAOSなど、自力でPATHを通せるシェルとの組み合わせがオススメ

Portable Rubyもあるようだ。使ったことないから中身は分からないけど
ttp://ruby.about.com/od/resources/ss/portable_ruby.htm
470466:2007/09/30(日) 17:28:30
>>467
>>469
ありがとうございます
portable rubyと言うのを試してみます

それがダメなら組み合わせられるやつを試してみます

ありがとうございました
471デフォルトの名無しさん:2007/09/30(日) 17:53:33
たぶん、InstantRailsが楽で良いんじゃね?
472デフォルトの名無しさん:2007/09/30(日) 19:04:54
俺はNYAOS + JmEditor2 + ruby-mswin32で
他のPCですぐに使えるようなパッケージを作ってた
(ついでにExerbやVisualuRubyも入れて)

大学やなんかのPC使うなら、エディタも一緒に入れておくと便利
473デフォルトの名無しさん:2007/09/30(日) 19:27:28
>>461
テスト作りながら開発、というのはどっかで対人で習ってやったことないとわからんと思う
件の記事だってTest::Unitを使ったことがある人前提だったろ
474デフォルトの名無しさん:2007/09/30(日) 22:45:34
配列をputsに渡したときの動作を変更したいのですが、どのようにすればいいでしょうか?

例えば
class Element
@name
def initialize(name)
@name=name
end
def to_s
@name
end
end
list = [Element.new("abcdefg"), Element.new("hijklmn"), Element.new("opqrstu"), Element.new("vwxyz")]
puts list

上記を実行すると
abcdefg
hijklmn
opqrstu
vwxyz
となりますが、
abc
hij
opq
vwx
と表示させたいです。

環境はruby 1.8.5 (2006-12-04 patchlevel 5000) [i386-mswin32]です。
475デフォルトの名無しさん:2007/09/30(日) 22:51:57
無理、あるいはputsの再定義をすべきではない。

配列を事前に細工したものを渡すか、puts_listとかそういう名前のメソッドを新たに作るべきと思う。
476デフォルトの名無しさん:2007/10/01(月) 20:36:01
macでruby/sdkをうまくインストールすることができません
どうすればいいでしょうか
versionはruby 1.8.6 p110
mac os x 10.4
です

477467:2007/10/01(月) 20:38:13
すみません間違えました
sdkじゃなくてsdlです
478476:2007/10/01(月) 20:39:00
さらに番号まで間違えてしまいました
479デフォルトの名無しさん:2007/10/01(月) 20:39:51
どこまでやって、どんなエラーがでたのかくらい書かないと
480476:2007/10/01(月) 20:44:12
sdlをダウンロードして
ターミナルでruby extconf.rbを実行したあと
make installをやりましたが 
エラーが出てできませんでした
実行時に出たエラーです
結構量があるので一部だけ貼り付けます
rubysdl_smpeg.c:22:25: error: smpeg/smpeg.h: No such file or directory
rubysdl_smpeg.c:28: error: parse error before ‘*’ token
rubysdl_smpeg.c:28: warning: data definition has no type or storage class
rubysdl_smpeg.c:34: error: parse error before ‘SMPEG_Info’
rubysdl_smpeg.c: In function ‘setInfoToSMPEGInfo’:
rubysdl_smpeg.c:36: error: ‘obj’ undeclared (first use in this function)
rubysdl_smpeg.c:36: error: (Each undeclared identifier is reported only once
rubysdl_smpeg.c:36: error: for each function it appears in.)
481デフォルトの名無しさん:2007/10/01(月) 20:54:08
何かパッチ当てたり、色々あるみたいだけど・・・
Macが手元にないので、何ともいえない
http://72.14.235.104/search?q=cache:2dQfA366_1YJ:www2s.biglobe.ne.jp/~nunokawa/wiki.cgi%3Fpage%3DRuby%252FSDL%2Bon%2BMac%2BOS%2BX+Ruby+SDL+Mac&hl=ja&ct=clnk&cd=2&gl=jp
482476:2007/10/01(月) 21:19:57
ありがとうございます
SDLをインストールしていなかったのが原因だったようです

483デフォルトの名無しさん:2007/10/01(月) 22:28:28
>>474
puts は渡されたオブジェクトの to_s の結果を出力するので

def to_s
 @name
end

の @name を @name[0,3] 等、好きなように書換えれば良い。
ただし to_s を利用するメソッドに影響が出る事を忘れるな。

# 何をしたいのか解らんが、方向を間違えてるような気がする…
484デフォルトの名無しさん:2007/10/01(月) 22:35:26
> to_s を利用するメソッドに影響が出る
だからやるべきじゃないんだよね…
>>475のやり方が妥当だと思う
485デフォルトの名無しさん:2007/10/01(月) 23:15:32
listの特異メソッドとして、または
Arrayを継承したElementListクラスを作って
to_sをオーバーライドするとか
486デフォルトの名無しさん:2007/10/01(月) 23:45:19
>>485
そりゃRubyは標準のクラスやメソッド勝手に上書きすりゃなんでもできるけどさああああああああ

Rubyの勉強のためのコードならまだしも、実際に使うスクリプトではやってはイカン動作だと思うが…
487デフォルトの名無しさん:2007/10/02(火) 00:47:47
自分用ののスクリプトだったら何でもアリだと思うけどね
目的のためなら実装の美しさに目をつぶることもしばしば
488デフォルトの名無しさん:2007/10/02(火) 01:01:23
489デフォルトの名無しさん:2007/10/02(火) 01:02:33
いやいや、継承で違う配列クラスを作れって言ってるんじゃないのか
標準ライブラリの再定義とは全然意味が違う
>>474が何をするかによるが、見た感じ出力用のメソッド作るより妥当な気はする
490デフォルトの名無しさん:2007/10/02(火) 01:07:46
Elementクラスのto_sの話のような気もしないでもない。
491デフォルトの名無しさん:2007/10/02(火) 02:00:10
ちょっと質問です。

gemでインストールしたライブラリのドキュメント(rdoc、ri、readmeなど)を参照したい場合、
エクスプローラでrubyのディレクトリから階層をたどっていって直接開くしか方法はないのでしょうか?
かなり面倒なので、操作を簡略化したいのですが・・・。
なにか簡単な方法があれば教えてください。(みなさんどのようにしていますか?)
492491:2007/10/02(火) 02:02:36
もうひとつ。

riの検索にrefeを使っているのですが、gemでインストールしたライブラリのメソッドも
検索対象にすることはできるのでしょうか?
こちらも、もし分かれば教えていただきたいです。

よろしくお願います。
493デフォルトの名無しさん:2007/10/02(火) 02:08:43
>>491
RDocならgem_server
494デフォルトの名無しさん:2007/10/02(火) 02:51:18
>>490
>>474はElement#to_sをわざわざ@nameと定義してる。
つまり、Element単体では@nameを返して欲しいんだと思う。
でもElementの配列には@name[0,3]を返して欲しい、ということじゃないのか?

>>485は別に標準クラスを弄るんでなく、クラス作れって話。
特異メソッドやArray継承はputsがどうやって配列から値を取り出してるか解らんので保留。
495デフォルトの名無しさん:2007/10/02(火) 11:51:07
class Element
 def initialize(name)
  @name = name
 end
 def to_s
  @name
 end
 def to_s_for_puts
  @name[0, 3]
 end
end

module Kernel
 alias org_puts puts
 def puts(*args)
  args = args.map{|e|
   unless e.respond_to?(:to_ary)
    e
   else
    e.to_ary.map{|x|
     x.respond_to?(:to_s_for_puts) ? x.to_s_for_puts : x
    }
   end
  }
  org_puts(*args)
 end
end

いちおう出来た。IOでも再定義すればぉk。
しかしなんとなく良心が痛む。
496デフォルトの名無しさん:2007/10/02(火) 14:12:58
それだと結局putsの再定義のような…w
497デフォルトの名無しさん:2007/10/02(火) 15:23:28
前スレ 959 で FreeBSD ports でインスコできる HTML パーサを質問した者ですが、
いつのまにか Hpricot や scrAPI が ports 入りしておりました。
ports メンテナさんありがとー。
498デフォルトの名無しさん:2007/10/02(火) 19:40:23
"定義ファイルabcd"のように、日本語+英字とかの組み合わせから英字のみを抽出したいのですが、

name1 = /[a-zA-Z_]+/.match("定義ファイルabcd")
p name1
# => "t"
と、なってしまいます。

正規表現の部分を、\w+とかにかえても同じです。
[abdcb]+とかだと抜き出せるみたいです。[abdcbt]+だとダメでした。

環境は、ruby-1.8.5-i386-mswin32で、文字コードはデフォルトです。

どのように指定したら、英字のみを検索することができるのでしょうか?


499デフォルトの名無しさん:2007/10/02(火) 20:30:01
> 文字コードはデフォルトです
正規表現に関連する文字コードの勉強しとけ
原因わかったし小手先で直ったが、たぶん理解できずにまた同じ間違い犯すから
500デフォルトの名無しさん:2007/10/02(火) 20:30:07
pにMatchData渡してそんな出力得られたっけ? 自分1.8.2くらいだけど
どっかで変わったのか?

それはともかくmatchする文字列の文字コードに$KCODEか正規表現オプションを
合わせる。
501デフォルトの名無しさん:2007/10/02(火) 20:50:35
>>500
p すると #<MatchData:0x2e25188> のように表示「されなければならない」と思うんだけどね。
バージョンによって違うのかも。
502476:2007/10/03(水) 18:48:04
また質問です
この前インストールできたと思っていたのですが
るびまに乗っているサンプルを動かしてみようとしたところ
下記の様なエラーが発生してしまいました
dyld: NSLinkModule() error
dyld: Symbol not found: _init_smpeg
Referenced from: /usr/lib/ruby/site_ruby/1.8/i686-darwin8.10.1/sdl.bundle
Expected in: flat namespace

Trace/BPT trap

どうすればいいいんでしょうか
503デフォルトの名無しさん:2007/10/03(水) 23:36:23
エラーが出たらエラーメッセージで検索する
504デフォルトの名無しさん:2007/10/03(水) 23:43:04
変数名で困ってます。
* filename: 'foo/bar/baz.html'
を2つに分けて
* dirname: 'foo/bar'
* basename: 'baz.html'
にします。さらにbasenameを分けたとき、'baz' の部分は何と呼ぶのが一般的ですか。
* ???: 'baz'
* extension: '.html'
505デフォルトの名無しさん:2007/10/03(水) 23:58:02
basename は baz
filename が baz.html
extname(ext)が .html

なに、File.basenameとできる文字列の名前の対応が違う?
File.basenameは拡張子削る機能が標準でついてるだろ?
もともとのシェルコマンドのbasenameにもついてるはずだ
506デフォルトの名無しさん:2007/10/03(水) 23:59:50
>>504
それ呼び名はあるのかな?聞いたことないや
507デフォルトの名無しさん:2007/10/04(木) 04:01:40
XXX. がprefix、.XXX がsuffixなら、真ん中はrootじゃない?
508デフォルトの名無しさん:2007/10/04(木) 09:35:32
漏れの好み:

path: 'foo/bar/baz.html'
dir: 'foo/bar'
filename: 'baz.html'
basename: 'baz'
ext: 'html'
509デフォルトの名無しさん:2007/10/04(木) 09:59:21
>>508
妥当

何も説明がない場合は俺は少なくともこれだと理解する
filenameにはDOSでいう拡張子が含まれてるし、pathはいわゆるフルパス
510504:2007/10/04(木) 21:24:30
みなさん回答いただきありがとうございます。
今後は>>508の方針にしたがって生きていくことにします。

ソースの読みやすさには型よりも名前の方が重要だと気づいた今日この頃
511デフォルトの名無しさん:2007/10/05(金) 01:58:43
csvで取ってきた全項目から[,]や["]を簡単に全角化出来ないでしょうか?

WindowsXP
ruby 1.8.5 (2007-03-13 patchlevel 35) [i386-mswin32]

ttp://www.gesource.jp/programming/ruby/database/sqlite.html
↑や初心者本を読みながら、下のような感じで見よう見まねでsqliteに登録しています。

db.execute2('select * from 社員') do |row|
 a01,a02,a03,a04,a05,a06,a07,a08, 〜中略〜,a53,a54 = row
 sql = "insert into yOrders values ( '"+ a01+"','"+a02+"','"〜中略〜'"+a53+"','"+a54+"');"
 db.execute(sql)
end

処理の最後にcsvを出力しているのですが、やっと8割方完成した所で、
出力側csvは["]が使えない仕様(文字項目を"〜"で括れない)だったのが判明しまして、
このままだと文字項目内の文字列として存在する筈の["]や[,]で誤動作しそうなので、
全角に変換したいのですが、今の自分の頭では、

a01 = a01.gsub(/,/,",")
a01 = a01.gsub(/"/,"”")
a02 = a02.gsub(/,/,",")
a02 = a02.gsub(/"/,"”")
〜後略〜

これが精一杯で綺麗な方法が思いつきません。こんなのを全部で数百回繰り返すのは、
さすがにイヤなのですが、もう少しスマートなやり方は無いでしょうか?
よろしくお願いします。
512デフォルトの名無しさん:2007/10/05(金) 02:14:02
>>511
a01、a02・・・じゃなく配列にしてぶん回せば?
513511:2007/10/05(金) 02:35:13
>>512
お返事ありがとうございます。
配列にすると、処理の本体の方への波及が激しそうなので断念しました。
出来れば、あまり構造を変えない形でお願いしたいのですが…
せっかくレスいただいてるのに後出し条件になってしまい本当に済みません。

配列化しか順当な方法が無い感じでしょうか?
もしそうなら、覚悟を決めて本体処理側も変数名を変えていきます…
514デフォルトの名無しさん:2007/10/05(金) 02:51:25
そりゃ綺麗な方法があるとは思うけど単純に打つのが面倒なだけなら
evalすれば。

1.upto 54 do |i|
 eval("a%02d.gsub(/,/, ', ')" % (i +1)")
end
とか
515デフォルトの名無しさん:2007/10/05(金) 04:10:05
面倒でも配列に直した方が確実に良くなるよ
どうしてもそれが出来なくても、配列で処理してから「a01,a02〜」へ代入するか、
「a01,a02〜」が入った配列を用意するとかで多少すっきりするかも
個人的にはeval使ったら負けた気になる(けど>>511が求めてるのは>>514なんだろな)
516デフォルトの名無しさん:2007/10/05(金) 05:57:27
tab区切りに変えたら?
517デフォルトの名無しさん:2007/10/05(金) 08:18:02
>>511
db.execute2('select * from 社員') do |row| # yOrdersか?
 row.each do |col|
  col.gsub!(/,/,",")
 end
end

もしくは row[i]
ruby で sqlite 使うなら少なくともここは見とけ
ttp://sqlite-ruby.rubyforge.org/sqlite3/faq.html

それより、一つのテーブルに54もフィールド作んなよ
518デフォルトの名無しさん:2007/10/05(金) 11:00:08
>>517
>それより、一つのテーブルに54もフィールド作んなよ

それ以上のも結構あるよ
519デフォルトの名無しさん:2007/10/05(金) 11:43:00
自慢すんなよ
520デフォルトの名無しさん:2007/10/05(金) 13:26:19
navi2ch_url ="http://pc11.2ch.net/tech/1183115034"

a = navi2ch_url.split(/\//)
return "http://#{a[2]}/test/read.cgi/#{a[3]}/#{a[4]}/"

これの最後2行を一時的な配列aを使うことなくわかりやすく書きたいです
521デフォルトの名無しさん:2007/10/05(金) 13:42:15
navi2ch_url.sub(%r{.*?//([^/]*)/(.*)}, 'http://\1/test/read.cgi/\2/')
522デフォルトの名無しさん:2007/10/05(金) 13:59:38
ああ、

…なんだかわかりやすさが微妙ですが使ってみることにします
523デフォルトの名無しさん:2007/10/05(金) 14:12:06
そもそも素直にaを使えばいいと思うのだがどうか
524デフォルトの名無しさん:2007/10/05(金) 14:21:02
即廃棄する配列作るのヤなんだろ
525デフォルトの名無しさん:2007/10/05(金) 14:26:33
分かりやすく書くことが目的なんだから本末転倒だな
526デフォルトの名無しさん:2007/10/05(金) 14:29:51
それに、最初の例と比べて「わかりやすさが微妙」であるようには思えないなぁ。
527デフォルトの名無しさん:2007/10/05(金) 14:34:21
そんなことより聞いてくれよ
Emacsで書いてたスクリプトの長い長い正規表現を手直ししようと思ってマウス使ってirbにコピペしたんだ
どうしてもそもそも違ってる感じでどうしたのかと思ったらEmacsの折り返し記号の \ ごとコピペしてたんだよ
許可するから笑っていいぞ
528デフォルトの名無しさん:2007/10/05(金) 14:35:59
>>527
ココはオレの日記帳だ
オマエはチラシの裏に書いておけ
529デフォルトの名無しさん:2007/10/05(金) 14:38:37
>>527
ごめん正規表現に夢中で聞いてなかった
530デフォルトの名無しさん:2007/10/05(金) 15:32:30
自身のプロセスがどのポートへバインドしているかどうかって簡単に分かりますか?

`netstat -lnp | grep #{Process.pid}`

で結果をパースする方法か、サーバプロセスのソースをちょっと弄る方法が
あるかなぁと思っているのですが、あんまり賢くないような気がしていまして。。

何か良い方法があったら教えて下さい。
宜しくお願いしますー。
531デフォルトの名無しさん:2007/10/05(金) 19:31:30
すいません、イテレータとブロックって別の事を指すと思っていたのですが
同じ物なのでしょうか?
532デフォルトの名無しさん:2007/10/05(金) 19:38:39
Rubyでは同じもの

言葉としては「イテレータ」には「繰り返し(イテレーション)」に
使うもの、という意味合いがある
533デフォルトの名無しさん:2007/10/05(金) 21:54:40
イテレータは概念に近い。
hogee{|e| … } とか hoget do |e| …; end とかの「メソッドのケツにブロック」を用いて繰り返しをすると
それはRubyでは歴史的にイテレータと呼ばれる。

今は(繰り返しの)「ブロックつきメソッド」とかいう注意深い表現をするけど。

昔は全部イテレータって呼んでたんだけど、「繰り返さないイテレータってイテレータじゃねーよな」ということになった。
別にイテレータでもいいんだけどねえ。
534デフォルトの名無しさん:2007/10/06(土) 08:20:23
yieldって何て読むの?
535デフォルトの名無しさん:2007/10/06(土) 08:22:48
漏れはイールドと
536デフォルトの名無しさん:2007/10/06(土) 08:29:53
外付けHDDを見てたら、↓がでてきたんだけど、
3年も前に1.9出てたの?
ruby-1.9.0-20040519-i386-mswin32.zip
537デフォルトの名無しさん:2007/10/06(土) 11:54:47
RailsをRubyGemsでインストールして、プロジェクトを新しく作ろうとしたのですが
なぜかERBのcompile errorが出てしまいます

% rails -d sqlite3 testproj
(略)
create public/404.html
(erb):9:in `template': compile error (SyntaxError)
(erb):9: syntax error, unexpected tIDENTIFIER, expecting $end from d:/ruby/lib/ruby/gems/1.8/gems/rails-1.2.4/bin/../lib/rails_generator/commands.rb:280:in `template'

エラーメッセージを参考に、commands.rbの280行目を見ても
b = binding を実行しているだけで、ERBが何かしている様子はありませんでした。
また、gems/rails-1.2.4/html/404.html も開いてみましたが
とくにsyntax errorは見つかりませんでした(そもそもスクリプト片が入っていません)
これはどう対処すればいいのでしょうか?

環境は、Railsのバージョンが1.2.4
ruby 1.8.5 (2006-12-25 patchlevel 12) [i386-mswin32]
Windows XP HomeEdition です。
538デフォルトの名無しさん:2007/10/06(土) 11:58:02
>>536
4年前からある。
1.8(安定版)1.9(開発版)なので、
1.8.0がリリースされたときから1.9はあったよ。
539デフォルトの名無しさん:2007/10/06(土) 12:05:09
>>537
template
540デフォルトの名無しさん:2007/10/06(土) 12:19:19
541デフォルトの名無しさん:2007/10/06(土) 14:25:52
イテレータを使うにはyieldが要ーるど なんつて
542デフォルトの名無しさん:2007/10/06(土) 14:26:11
Hpricot は ハプリコット
543デフォルトの名無しさん:2007/10/06(土) 19:58:00
ュィールド
544デフォルトの名無しさん:2007/10/07(日) 00:04:01
>>538
1.8.0がリリースされたときはまだなかったと記憶してるが。
1.8がtrunkじゃなくなったのは1.8.1を出すときだったはず。
545537:2007/10/07(日) 02:27:47
>>539
templateとだけ言われても・・・
546デフォルトの名無しさん:2007/10/07(日) 11:04:12
>>520
亀レスだけどこれでどう?
'http://%s/test/read.cgi/%s/%s/'%navi2ch_url.split('/')[2,3]
547デフォルトの名無しさん:2007/10/07(日) 12:50:46
パイプの処理について教えて下さい。例えば
$cat sample.rb
#/usr/bin/ruby
p ARGV
というスクリプトがあるとして ./sumple.rb hoge --> ["hoge"]
これをパイプのあとで処理すると期待通りになりません。

echo "hoge" | ./sumple.rb --> []
期待してるのはおなじ結果の["hoge"]です。

open3をつかうとパイプの前の処理があらかじめ固定されてしまうので都合が悪いのです。

#/usr/bin/ruby
p ARGV
p STDIN.read

とすると,今度は ./sample.rb hogeのときに処理が停止してしまって都合が悪いのです。

./sample.rb hoge の場合でも echo "hoge" | .sample.rb のばあいでも期待通り["hoge"]になるのにはどうしたらいいのでしょうか?
548デフォルトの名無しさん:2007/10/07(日) 12:55:44
>>547
$ cat echo.sh
#!/bin/sh
echo $1
$ echo "hoge"
hoge
$ ./echo.sh "hoge"
hoge
$ echo "hoge" | ./echo.sh

$
549デフォルトの名無しさん:2007/10/07(日) 18:49:52
mac os x tigerを使っているのですがるびまにある ttp://jp.rubyist.net/magazine/?0018-GameProgramingForRubySDL
サンプルファイルをダウンロードし "何か描いてみよう"まではちゃんとできたんですが
次の"画像を表示してみよう"がエラーが出て動きません
エラーの内容は
/Users/xxx/Desktop/rubima_sdl_sample/main.rb:11:in `load': Couldn't load image/nos_front.png: Couldn't open image/nos_front.png (SDL::Error)
です
macportで入れたので
libsdl
libsdl_image
libsdl_mixer
libsdl_ttf
rb-opengl
は 入っているはずです
sampleファイルの中身はmain.rb以外触っていません



550デフォルトの名無しさん:2007/10/07(日) 19:15:55
なんでだろ。
image/nos_front.pngが見つからないって出てるけど、
サンプルパックにはimage/nos_front.pngがあるよね・・・

カレントディレクトリが違うとか。
どこのディレクトリで実行してる?
551549:2007/10/07(日) 19:36:20
ターミナル起動後 cd /Users/xxx/Desktop/rubima_sdl_sampleをして
rsdl main.rbとしています
rubyのバージョンは
ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-darwin8.10.1]
です

552デフォルトの名無しさん:2007/10/07(日) 19:57:20
>>547
スクリプト起動時に指定されたファイルの内容と、
パイプ経由で読み込む内容を同一視するのならわかりますが、
やろうとしていることが、いまいち分かりません。

私もRubyについて詳しくはありませんが、
標準入力から読もうとした場合、ARGVは nil または 空白に
なるのではないでしょうか。
553デフォルトの名無しさん:2007/10/07(日) 20:44:30
>>547
そうゆう非標準的なものは普通用意されてないもんだ。
これでがまんしろ
hoge = ( 0 < ARGV.size ? ARGV[0] : $stdin.gets.chomp )

ちなみに標準的ってのは cat とか less とかのことな。これなら ARGF でいける。
554デフォルトの名無しさん:2007/10/08(月) 00:28:08
http://www.rubyist.net/~matz/20070926.html#p01
などで、話題に出ている m17n とはどういう機能のことなんでしょうか?

現状、-Ks とかで、困っていないのですが、
Rubyには、致命的なな何かがあるのでしょうか?

どなたか、3行でまとめ(ry
555デフォルトの名無しさん:2007/10/08(月) 00:31:30
ライブラリ内で
日本語コメントが
使えない
556デフォルトの名無しさん:2007/10/08(月) 00:53:21
>>555
d
マジっすか (´д`)
確かに、ライブラリだと、-Ksとかできないな・・・
557555:2007/10/08(月) 02:24:18
たぶん実際にはもっと色々ある
俺が期待してるのは、ライブラリのエンコーディング指定ぐらいだけど
558デフォルトの名無しさん:2007/10/08(月) 03:31:52
設定プログラムとかで (コンソールでyとかnで答えてくやつ
ENTERなしでプログラムが入力を認識してるものがあるのですが
rubyで同等の機能を実現するにはどうすればよいでしょうか?
559デフォルトの名無しさん:2007/10/08(月) 07:00:35
>>558
require 'curses'
560549:2007/10/08(月) 09:25:53
色々試して見たところ
画像だけでなくファイルをrequireなどで呼び出すこともできませんでした

561デフォルトの名無しさん:2007/10/08(月) 10:12:15
そうですか
では色々試してください
562デフォルトの名無しさん:2007/10/08(月) 10:31:08
>>560
カレントディレクトリに画像ファイルとか置いても同じ?
残念ながらMacがないので、試しようがないけど。

もし、ダメならrsdlとやらがダメだとしか・・・
563デフォルトの名無しさん:2007/10/08(月) 10:32:42
なんでその場しのぎの対処ばっかで設定を表示させようとしないんだ
564デフォルトの名無しさん:2007/10/08(月) 15:19:43
例外のスタックトレースが... xxx levels ...と省略されてしまうのですが、
すべて見るにはどうすればよいのでしょうか?

↓こんな感じです
/usr/local/lib/ruby/1.8/optparse.rb:1381:in `complete': invalid option: -T (OptionParser::InvalidOption)
from /usr/local/lib/ruby/1.8/optparse.rb:1379:in `catch'
from /usr/local/lib/ruby/1.8/optparse.rb:1379:in `complete'
from /usr/local/lib/ruby/1.8/optparse.rb:1236:in `order!'
from /usr/local/lib/ruby/1.8/optparse.rb:1205:in `catch'
from /usr/local/lib/ruby/1.8/optparse.rb:1205:in `order!'
from /usr/local/lib/ruby/1.8/optparse.rb:1279:in `permute!'
from /usr/local/lib/ruby/1.8/optparse.rb:1300:in `parse!'
from /usr/local/lib/ruby/1.8/optparse.rb:1290:in `parse'
... 15 levels...
565デフォルトの名無しさん:2007/10/08(月) 15:25:30
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/31027
> Date: Wed, 20 Jun 2007 01:44:54 +0900

> |で、思ったのですが、発生した例外が SystemStackError でないと
> |きは全部出すのはどうでしょうか。
>
> 妥当だと思います。しばらく試してみましょう。コミットしてください。
ということで、6月から進展はあったんかいのう
566デフォルトの名無しさん:2007/10/08(月) 15:47:09
>>565
情報ありがとうございますー
現状だとできなさそうですね…
567デフォルトの名無しさん:2007/10/08(月) 21:37:30
アドバイス願います。
これまでJavaメインでC#,Perlなどをやってきましたが、Rubyも触ってみようと思いまして入門書を探しております。
Amazonあたりで検索してみると、「たのしいRuby」と「 Rubyプログラミング入門」あたりが良さそうですが、出版がやや古いのが気になりました。
それなりに最新版に対応したオススメの書籍はあるでしょうか?
568デフォルトの名無しさん:2007/10/08(月) 21:41:57
>>567
つ「たのしいRuby 第2版」
569デフォルトの名無しさん:2007/10/08(月) 21:45:58
プログラミングの経験があるなら書籍なくてもいけそうな気がするけどね

るびまあたりでポチポチ弄って特に興味が出てきた専門的な方面(Railsとか)の
書籍買うパターンも悪くないんじゃないかな

http://jp.rubyist.net/magazine/
570デフォルトの名無しさん:2007/10/08(月) 21:54:01
>>568
2版見つけましたorz
とりあえずこれを購入しておきます

>>569
ある程度はWebで見ているんですが、通勤中や朝のドトールで読めるように紙媒体で1つ入門書は欲しい所なんです
教えていただいたサイトは参考にさせてもらいます。
571デフォルトの名無しさん:2007/10/08(月) 22:25:59
>>570
通勤中だとつらそうだ。Rubyの本て数少ないせいかデカいか分厚いのどっちかだもんな。
2冊バッグにいれた日にはもう拷問よw
技評のポケットリファレンスみたいなの出ないかなぁ。
572デフォルトの名無しさん:2007/10/08(月) 22:32:13
>>571
大丈夫。
プログラミング言語Java(700頁弱)を満員電車で読んだからw
573デフォルトの名無しさん:2007/10/08(月) 22:33:48
>>572
安心w
574デフォルトの名無しさん:2007/10/08(月) 22:33:50
「たのしいRuby」は自分も電車で読んでて手が痛くなったよ
サイズは小さいけど、微妙に分厚いw
575デフォルトの名無しさん:2007/10/08(月) 23:19:45
初心者スレとおもったけど高度すぎorz
スレ違いなら誘導してください。

「Ruby ビギナーのための CGI 入門」って連載ページ見つけてやってました。
プログラミング未経験(VBAで集計程度)、RubyもCGIももちろん知らないです。
この連載にあるとおり、One-Click Ruby InstallerでRubyをインストール。
で、連載には、システム環境変数"RUBYOPT" の値は "rubygems rubygems "と
あるんですけど、私のところでは "-rubygems"。

環境変数ってくらいだから、人によって変わってたりするんでしょうけど、
One-Click Ruby Installer でRuby入れて、項目RUBYOPTの値がちがうてのがなぞです。

これってどういう状態なんでしょうか?rubygemsが入ってないとか?
連載と同じようにRUBYOPT" の値を "rubygems rubygems "にするにはどうしたらよいのでしょうか?
せっかく興味もって勉強できそうなページみつけたのに、こんなところで躓いています。
臨機応変に汁!と言われそうですが、 "rubygems rubygems "と"-rubygems"の違いもわからないし…。
ご教示いただければ助かります。よろしくお願いします。

576デフォルトの名無しさん:2007/10/08(月) 23:25:11
>>575
RUBYOPTがどうとかどこにかいてあるんだ。。
せめてそのページのURLくらい貼ってよ
577575:2007/10/08(月) 23:36:44
>>576
レスありがとうございます。
ttp://jp.rubyist.net/magazine/?0012-CGIProgrammingForRubyBeginners-1#l15
の「環境変数 - ENV」という項です。
相手をしていただいてありがとうございます。
よろしくお願いします。
578デフォルトの名無しさん:2007/10/08(月) 23:46:41
>>577
多分、そのまま-rubygemsでいいと思う。
RUBYOPTはrubyに渡すオプションみたいなものだから。
そのページが間違えてるんじゃないかな?

万が一、この先つまづいたら、もう一度スレで質問するといいかも
(漏れは今日はもう寝るけど)
579575:2007/10/08(月) 23:56:34
>>578
なるほど!ありがとうございました!
>RUBYOPTはrubyに渡すオプションみたいなものだから
CUIでオプションつきコマンドを実行するときって、確かに
command -option ってなりますね。
安心して勉強できます。本当にたすかりました。
580デフォルトの名無しさん:2007/10/09(火) 10:42:03
>>575
> で、連載には、システム環境変数"RUBYOPT" の値は "rubygems rubygems "と

同じのが二つあるほうが変。
アンインストールと再インストールを繰り返したりしたのかも。

> あるんですけど、私のところでは "-rubygems"。

普通はそれでいい。
581デフォルトの名無しさん:2007/10/09(火) 12:26:30
n = (1..5).inject{ |m, x| m * x }
puts n
120

n = (1..5).inject{ |m, x| m + x }
puts n
15

初期値を与えなくていいのはなぜですか?
582デフォルトの名無しさん:2007/10/09(火) 12:30:24
>>581
irb> ['a','b','c'].inject{|r,i| r << i}
"abc"

マニュアルより
> inject([init]) {|result, item| ... }

> 初期値 init を省略した場合は、最初に先頭の要素と 2 番目の要素をブロックに渡します。

583デフォルトの名無しさん:2007/10/09(火) 12:39:02
>>582
見落してましたorz
てっきり0で初期化されるものとばかり…
584デフォルトの名無しさん:2007/10/09(火) 12:49:23
これに頼った書き方をするのはあまり素性よくなさそうだ
selfの先頭要素になにか特別なものが入ってるとかならいいんだろうけどさ

> [arr=Array.new, 1,2,3].inject{|a,e| a.push(e)}
> p arr
[1, 2, 3]
面白い使い方が思いつきそうで思いつかない
585デフォルトの名無しさん:2007/10/09(火) 17:08:30
重いから本を章ごとにぶっちぎって製本しなおしてるのは俺くらいか・・・
586デフォルトの名無しさん:2007/10/09(火) 17:14:58
ブロック内からレシーバのメソッドにアクセスするにはどうすればよいでしょうか
残念ながら下記のself.sizeはエラーです

[1, 2, 3, 4, 5].each do |v|
 p "%d %d" % [v, self.size]
end
587デフォルトの名無しさん:2007/10/09(火) 18:08:54
(a=[1, 2, 3, 4, 5]).each do |v|
p "%d %d" % [v, a.size]
end

a が残るのが難点だが
表示させるたびにわざわざ配列作ってるような奴はそんなこと気にすんな

なんかうまい方法でもあるんかね、こういうの
588デフォルトの名無しさん:2007/10/09(火) 18:33:23
>>585
そうでもないような。
以前、「オブジェクト指向スクリプト言語 Ruby」をぶった切ってた人を散見した記憶が。
589デフォルトの名無しさん:2007/10/09(火) 21:53:07
すみません。RDE(ver.1.1.1.1)の設定で教えて下さい。

コンソールウィンドウのフォントサイズの変更を再起動後も反映したままにする方法がわかりません。
変更はできましたが一度終了させると元サイズに戻ります。
ソースウィンドウの方は再起動後も変更が反映されますがこっちは出来ないのでしょうか?
文字が小さくて読みにくいです。よろしくお願いします。
590589:2007/10/09(火) 21:55:24
すみません、フォントサイズは解決しました。
591デフォルトの名無しさん:2007/10/10(水) 10:26:44
>>586
eachブロックからレシーバのメソッドって見せないほうがいいんじゃないの?
ループの抽象化を壊してると思う。
592デフォルトの名無しさん:2007/10/10(水) 11:11:29
まあ、普遍的にできりゃそれはそれで面白いけどな。
現行では、少なくとも、ブロックつきメソッドの定義時点でそのように作られてない限りアクセスできないだろうね。

arr=[1, 2, 3, 4, 5]
arr.each do |v|
 p "#{v} #{arr.size}"
end

とか

arr=[1, 2, 3, 4, 5]
puts arr.map{|v| "#{v} #{arr.size}".inspect}

このへんが妥当かと…
593デフォルトの名無しさん:2007/10/10(水) 11:49:22
module Kernel
 def itap(&block)
  instance_eval(&block)
 end
end

[1, 2, 3, 4, 5].itap{
 each{|v| p "%d %d" % [v, size] }
}

レシーバなくせたけど超危険。
594デフォルトの名無しさん:2007/10/10(水) 12:08:58
というか

"%d %d" % [v, self.size]

わざわざ % 記法をこんなとこで使ってる時点でなんというか怪しい
595デフォルトの名無しさん:2007/10/10(水) 12:20:15
未だに sprintf をついつい使ってしまう俺よりは…
596デフォルトの名無しさん:2007/10/10(水) 12:20:51
記号の使い方に合理性などない
597デフォルトの名無しさん:2007/10/10(水) 12:25:22
>>594
それは%記法ではなくてStringクラスのインスタンスメソッドだね
普通に使うでしょ
598デフォルトの名無しさん:2007/10/10(水) 12:38:19
ふと思いついてやった。反省はしてない
$ irb
irb(main):001:0> foo = "%d %d"
=> "%d %d"
irb(main):002:0> foo %= [1, 2]
=> "1 2"
irb(main):003:0> foo
=> "1 2"
599デフォルトの名無しさん:2007/10/10(水) 12:51:40
初心者スレだからどうでもいいが、経験上
print や sprintf や for を使う人は無茶なこと言ってくる割合が高い
600デフォルトの名無しさん:2007/10/10(水) 13:44:04
class Array
 def each(&pr)
  idx = 0
  while idx < size
   pr.arity == 1 ? yield(self[idx]) : yield(self[idx], self)
    idx += 1
  end
 end
end
[1, 2, 3, 4, 5].each do |v, r|
 p "%d %d" % [v, r.size]
end
[1, 2, 3, 4, 5].each {|v| puts v}

なんとなーく曖昧なので誰か添削してw
601デフォルトの名無しさん:2007/10/10(水) 15:10:48
年齢計算をしたいのですが上手くいきません。
TimeやDateを利用した方法だと無理なのでしょうか?
(1970/1/1以前も計算したいのでDateを使いたい。Timeは検証用)
※ Timeはここ(http://www.sakalab.org/3zemi06/no6.html)にあった方法を使用

# Time
year,month,day = 2000,10,10
t = Time.now - Time.local(year, month, day)
print (t / (60 * 60 * 24 * 365.2425)).floor

# Date
require 'date'
year,month,day = 2000,10,10
bd = Date.new(year,month,day).mjd
now = Time.now
now_d = Date.new(now.year,now.month,now.day).mjd
print ((now_d - bd) / 365.2425).floor

今日を'07/10/10とするとTime版だと2000/10/10生まれだけ6歳と1歳若くなります。
Date版だと1999年以前の10/10生まれは正しいようですが、2000以降の10/10生まれは1歳若いです。
(1899年以前も'99〜'00前後がズレるようです。)
どうして一部だけズレるのか不明です。
一部のみ+1は複雑になるのでTime/Dateは使わず「現在年−誕生年=年齢(誕生日がまだなら-1)」の方がいいのでしょうか?
602デフォルトの名無しさん:2007/10/10(水) 15:33:49
うるう年の関係で1歳が365日になったり366日になったりするんだから
一律365.2425日で計算してたらズレが出てくるケースもあるんじゃないか?
603601:2007/10/10(水) 15:44:07
>>602
>> うるう年の関係で1歳が365日になったり366日になったりするんだから

そのために365や366ではなく365.2425で割ってるんじゃないんですか? (あれ?違う?)
604デフォルトの名無しさん:2007/10/10(水) 16:00:58
うるう年にするかどうかはきちんと分けなきゃ駄目

西暦が400で割り切れるのは完全にうるう年
400年で割り切れない場合100で割り切れる年はうるう年ではない
100で割り切れないけど4で割り切れる年はうるう年
4で割り切れなければうるう年ではない

どっかのライブラリで判定してた気がする
605デフォルトの名無しさん:2007/10/10(水) 16:08:37
>>604
そうですか…。閏年判定は簡単に作れるでしょうが通日使用のスマートさがなくて複雑になりそうですね。
「現在年−誕生年=年齢(誕生日がまだなら-1)」の方が単純なのでそちらで作ります。
ありがとでした。
606デフォルトの名無しさん:2007/10/10(水) 16:24:06
Ruby 年齢 Date でググって出てくるのじゃだめなの?
607デフォルトの名無しさん:2007/10/10(水) 16:27:07
こんなのとか。

def age(date, today = Time::now)
(today.strftime("%Y%m%d").to_i - date.strftime("%Y%m%d").to_i) / 10000
end
608デフォルトの名無しさん:2007/10/10(水) 16:30:45
>>601

floor ではなく round を使う。
609607:2007/10/10(水) 16:33:12
と思ったけど、正解を求めているわけではないのね。スマソ。
610デフォルトの名無しさん:2007/10/10(水) 16:56:12
>>606,>>607
ググったヤツを試したら出来ました。
質問前に見た時はTime使ってたので1970以前使えないと思い、試してませんでした。
これだと誕生日過ぎたとか閏年も問題なく使えますね。スマートだし。
ありがとうです。
611610:2007/10/10(水) 17:04:43
ITproの元記事も読んだ記憶ありましたw
612デフォルトの名無しさん:2007/10/10(水) 18:00:06
>>607は整数変換に突っ込み食らって修正してたよ。
613607:2007/10/10(水) 19:03:18
>>612
kwsk
614デフォルトの名無しさん:2007/10/10(水) 19:20:06
>>613
詳しくは辿りな

↓修正後
class Date
def age(calcDay = Time.now)
age = calcDay.year - self.year
return age -1 if calcDay.month < self.month
return age -1 if calcDay.month == self.month && calcDay.day < self.day
return age
end
end
615607:2007/10/10(水) 19:22:45
>>614
辿りな、ってよくわからんっす。

漏れが参考にしてたのはココなんだけど。
ttp://d.hatena.ne.jp/secondlife/20060221/1140500355
616デフォルトの名無しさん:2007/10/10(水) 19:30:04
突っ込みコメント自体は削除してる?
整数変換の問題ってなんだろ?
修正版(>>614)はまんま「現在年−誕生年=年齢(誕生日がまだなら-1)」 ですよね
617デフォルトの名無しさん:2007/10/10(水) 19:30:38
>>615
すまん、>>606でググッた先頭で話してんだと思ってた
607 = ttp://d.hatena.ne.jp/bellx2/20070825/p1
614 = ttp://d.hatena.ne.jp/bellx2/20070826/p2
618607:2007/10/10(水) 19:34:51
>>617
なるほど。
計算結果自体は問題ないけどやり方がキモいところが突っ込まれたのかな。
まあそれはもっともな気もする。
619デフォルトの名無しさん:2007/10/10(水) 21:50:35
>>618
すまん、オレも斜め読みしてた
正直、まだRuby慣れしてないから614ですらキモく感じる
620575:2007/10/10(水) 22:13:12
>>580
遅くなりましたがレスありがとうございました。

ここで聞いてよかったです。(私のように聡明ではない)初学者はチュートリアルと自分
の環境が違うと不安になるもので…。
CGI.new でフォームの名前と値を連想配列にいれてくれるなんて素晴らしい!とか
思いながら横道にそれながらも勉強を続けられています。きっとほかの言語にもこう
いう仕組みあるんでしょうが、なんかたのしいです。
自分の仕事に役立てられるまで(第一目標)はまずはがんばっていきたいです。
教えてくれた方々ありがとうございました。
621デフォルトの名無しさん:2007/10/10(水) 22:19:23
俺も初心者だからか>>614は変に思う。
Ruby的にはあんなにreturn並べるものなの?
returnないのも判りずらいけど

自分なら↓みたく書くんだが… ダメ?
age = calcDay.year - self.year
if calcDay.month < self.month ||
 ( calcDay.month == self.month && calcDay.day < self.day )
 age -= 1
end
return age
622デフォルトの名無しさん:2007/10/10(水) 23:17:33
Ruby関係ないしRubyはこれを特に制御しない
いわゆるサブルーチンの出口の数の問題

「returnが1個だと流れとして誤りがないだろバカ」
       ↑ ↓
「制御構造が入れ子になって見にくいだろバカ」
623デフォルトの名無しさん:2007/10/10(水) 23:18:37
>>621
いいんじゃね
624デフォルトの名無しさん:2007/10/10(水) 23:25:45
begin/rescue標準装備なことから考えて「ジャンプがたくさんあっても便利ならいいじゃん」という思想だと推測

規定以外であれば別値をreturn
規定以外であれば別値をreturn
正常な値をreturn

という規定外処理は if 文構造で分岐しまくるのと同じくらいRubyではフツーだと思う
625デフォルトの名無しさん:2007/10/11(木) 00:22:11
>>623
うん、いいね。どうでも。
626デフォルトの名無しさん:2007/10/11(木) 01:07:05
和式便器の座る向きくらいどうでもいいな
627デフォルトの名無しさん:2007/10/11(木) 01:53:12
値チェックなんかは def の次行から

return 値 if 条件式
return 値 unless 条件式
raise 例外 if 条件式
raise 例外 unless 条件式

はよく書くなぁ
628デフォルトの名無しさん:2007/10/11(木) 06:42:31
>>626
なにいってんだ、和製便器のあれは「玉隠し」なんだぞ。
629デフォルトの名無しさん:2007/10/11(木) 07:22:10
和式便器って言わないか普通
630デフォルトの名無しさん:2007/10/11(木) 08:23:49
メイドインジャパンを意識しない>>629は三国人
631デフォルトの名無しさん:2007/10/11(木) 09:14:02
いやー、でもTOTOの「和製洋式便器」には、玉隠しは無いしなぁ。
632デフォルトの名無しさん:2007/10/11(木) 09:42:22
たまに駅のトイレで金隠しの上にウンコする奴いるよな?
633デフォルトの名無しさん:2007/10/11(木) 09:55:30
"和製便器" に一致する日本語のページ 約 83 件中 1 - 10 件目 (0.74 秒)
"和式便器" に一致する日本語のページ 約 59,400 件中 1 - 10 件目 (0.10 秒)

このスレにもずいぶんとレアなマヌケが来たもんだ
634デフォルトの名無しさん:2007/10/11(木) 11:20:22
>>627
後置の条件ってどうもなれない。Perlもそうだけど。
どうしても一行に書きたいときは
条件式 and 処理
って書いてる。
635デフォルトの名無しさん:2007/10/11(木) 11:28:34
andに接続詞の意味を持たせるほうが気持ち悪いというかむしろ吐く

このへんは育ったプログラミング環境によるんだろうな
636デフォルトの名無しさん:2007/10/11(木) 11:33:54 BE:210432342-2BP(125)
if(条件式 && 処理)
とかいうのがCでたまにあるけど、その流れかな
637デフォルトの名無しさん:2007/10/11(木) 11:46:33
short circuit ってどこらへんが元祖なんだろう?
638デフォルトの名無しさん:2007/10/11(木) 12:33:32
if修飾子はRubyに慣れてない人がみるとビびっくらこいてウンチもらしちゃいそうだからなぁ・・・
639デフォルトの名無しさん:2007/10/11(木) 13:15:01
Perlで腐るほど使われてたので眉一つ動きませんでしたが何か

そりゃ見難い場面はあるだろうが便利だと思うんだけどなー
640デフォルトの名無しさん:2007/10/11(木) 13:24:47
>>628
あのな、あれは「金隠し」だ。
641デフォルトの名無しさん:2007/10/11(木) 13:49:44
>>639
何も無いよ、趣味ならね・・・
642デフォルトの名無しさん:2007/10/11(木) 13:51:12
BASICだとandの意味が&&と違ってるんじゃなかったかな。
つまり、 expr1 and expr2 だと両方評価する。expr2に副作用があると大変なことに。
643デフォルトの名無しさん:2007/10/11(木) 13:57:45
>>635
つーか、行頭で処理を見た時点で処理済みというか、後から条件つけられても
「えっ?」って思う。
思考の流れを分断されるというか...
うまく説明できなくてすまん。
644デフォルトの名無しさん:2007/10/11(木) 14:12:56
trueになるかどうかわからん判別式を行のはじめにいきなり提示されるほうが気持ち悪いわぼけー
↓以下しょうもないループ
645デフォルトの名無しさん:2007/10/11(木) 14:16:13
if文を1行に見目良く書けないということが諸悪の根源

if( true? ){ 〜〜〜 }

という書き方ができれば後置なんて流行らなかったろうに
646デフォルトの名無しさん:2007/10/11(木) 14:19:13
if <cond> then <expr1> [else <expr2>] end と書けるわけだが
647デフォルトの名無しさん:2007/10/11(木) 14:36:01
if 修飾子気持ちいいけどなぁ。
ループの先頭で next if ababa なんて書くのは。
648デフォルトの名無しさん:2007/10/11(木) 14:37:14
end地獄こそが諸悪の根源じゃ
649デフォルトの名無しさん:2007/10/11(木) 14:37:30
short circuit は昔からありそうな気はする...
実装として、か、仕様として、かは調査してみないとぼみょ〜
650デフォルトの名無しさん:2007/10/11(木) 14:38:23
一行の if … then … end が見目善いかどうかは議論の余地があるな
てか { } ブロックって使えなかったっけ?
651デフォルトの名無しさん:2007/10/11(木) 15:29:13
定義してしまえ
def ifthen(expr)
yield if expr
end
652デフォルトの名無しさん:2007/10/11(木) 15:31:11
andはちょい変に感じるけど
orと修飾子のif、unlessは英文に近い感じで読めるから使う
653デフォルトの名無しさん:2007/10/11(木) 17:52:58
Rubyで自立的に動作するようなオブジェクトを作るにはどうすればいいですか?
たとえばニューラルネットワークを構成するユニットのインスタンスを複数個作成し、
そのインスタンスがお互いに入出力を監視しあうようなものです。
ThreadとQueueで実現できるような雰囲気はするのですが・・・

○:ユニット
←:入出力

○←→○
↑   ↑
↓   ↓
○←→○
654デフォルトの名無しさん:2007/10/11(木) 22:01:18
質問です。

Rubyist Magazineを見ながら試していたのですが、
「Ruby ビギナーのための CGI 入門 【第 1 回】 初めての CGI プログラム」
は上手くいったので、
「Ruby/SDLで始めるゲームプログラミング【前編】」
で、SDLを試そうとした所、最初のサンプルを実行すると、下記のエラーが出てしまいます。
インストールはC:\Rubyにして、パスも環境変数で見ると通っているのですが、
何か判る方居ませんか?

C:\ruby>ruby main.rb
c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require': no such file to load -- sdl (LoadError)
from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
from main.rb:2

OSはWIN2000、
Rubyは、One-Click Installer - Windows 1.8.6-25
SDLは、Win32's binary(ver 1.3.1) for Ruby 1.8

655デフォルトの名無しさん:2007/10/11(木) 22:20:56
Ruby/SDLはRubyじゃない部分が多すぎて初心者にはなー
というかgem自体がどうにも最初から劇薬って感じで好きくない

まあ爺臭い僻みはどうでもいいとして、えーと、
gem_original_require で no such file to load は悪名高いエラー
Ruby/SDLへのパスが通ってないか正しくインストールされてない
656デフォルトの名無しさん:2007/10/11(木) 23:23:37
>>655
情報ありがとうございます、
試しにインストールじゃなく、RubyとSDLがパッケージになってて、
解凍してパスを通せば使えると言うのをc:\Ruby2に入れてみたところ、
サンプルファイルをRuby2\binまで持って行けば動くようになりました。

しかし、そこ以外だとエラーどころかRubyを認識もしない・・・、
取りあえず動くには動いたんでもうちょっと弄って見ますわ。
657デフォルトの名無しさん:2007/10/12(金) 10:35:20
Procの使い方がよく分からないのですがアドバイス御願いします

Procのinstanceをblock付でcallするにはどうすれば良いでしょう
具体的には下のような感じにしたいのですが

pr = Proc.new {|x| x.times{|i| yield i}}
pr.call(3) do |i|
p i # 0、1、2と表示されて欲しい
end
658デフォルトの名無しさん:2007/10/12(金) 11:41:41
>>657
callにはブロックが渡せないのでは?
procのインスタンスにして渡すとこうなる。

pr = Proc.new {|x, p2| x.times{|i| p2.call i}}
p2 = Proc.new {|i| p i}
pr.call(3, p2)
659デフォルトの名無しさん:2007/10/12(金) 19:10:38
ttp://satoshi.blogs.com/life/2007/10/ruby-2.html
うにょろー

こういう時期に作ったスクリプトは半年くらい経ってから眺めても何やってるかさっぱりわからん
660デフォルトの名無しさん:2007/10/12(金) 22:07:59
文字列の括弧の中の値をキーにして
ソートするため下記のようなコードを書きました。

v=%w(AAA(A02) BBB(A01))
p v.sort{|a,b| a=~/\((.+)\)/; t=$1; b=~/\((.+)\)/; t<=>$1 }

これで一応動作しますが、sortに渡すブロックが泥臭い感じがします。
違う書き方があれば教えてください。
661デフォルトの名無しさん:2007/10/12(金) 22:26:24
p v.sort_by{|a| a.delete("^0-9").to_i}

欠点:C22(A03)が2203になる
662デフォルトの名無しさん:2007/10/12(金) 22:35:45
数字でソートしてるわけでもないように見える
B02とA03だとA03のほうが先に来て欲しいんじゃね

p v.sort_by{|a| /\(.+?\)/.match(a).to_s}
663660:2007/10/12(金) 22:41:18
sort_by なんてメソッドがあったんですね・・・勉強になりました。
キーについては、662さんのおっしゃるとおりで、
[A-Z]{3}\d{3}の形式で、辞書順にならんでほしいです。
私の例の書き方がわるかったですね。

ありがとうございました。>>661,>>662
664デフォルトの名無しさん:2007/10/13(土) 00:56:44
>>663
いわゆる自然順ソートをしたいってことやね。
ttp://d.hatena.ne.jp/secondlife/20050624/1119585033
665デフォルトの名無しさん:2007/10/13(土) 08:37:57
>>664
アホみたいに重そうだな。
666デフォルトの名無しさん:2007/10/13(土) 22:11:08
>>657
> Procのinstanceをblock付でcallするにはどうすれば良いでしょう
1.9 featureだが。

pr = Proc.new {|x, &b| x.times{|i| b.call(i)}}
667657:2007/10/14(日) 09:01:08
>>658,666
レスありがとう.
どちらの情報もとても為になりました.

v1.9での表記の方がスッキリしますね.
移行しようかどうしようか迷う...
668デフォルトの名無しさん:2007/10/14(日) 09:17:38
>>667
やめとけ。
669デフォルトの名無しさん:2007/10/14(日) 16:09:13
"a"という文字列から?aの値を得るにはどうすればいいのでしょうか
670デフォルトの名無しさん:2007/10/14(日) 16:25:03
この方法をマニュアルから見つけられるかどうかが初級者脱出の境目だと思う

irb> 'a'[0]
97
irb> 97.chr
"a"
671デフォルトの名無しさん:2007/10/14(日) 16:28:22
>>670
ありがとうございます。
まさか単純にインデックスを指定すればよかったとは・・・
to_chrとかそんな感じのメソッドばっかり探してましたorz
672デフォルトの名無しさん:2007/10/14(日) 16:33:27
ttp://www.ruby-lang.org/ja/man/?cmd=view;name=ruby+1.9+feature
ふっ、甘い。それは「たまたま」ASCII コードを返してるだけであって Ruby1.9 では既に動かないぞ。
> String#ord という、1文字の文字列に対し、その文字のコードを返すメソッドが追加されました
> string[integer] が 1文字の String を返すようになりました

つまり Ruby1.9 では 'a'[0] は 97 ではなく 'a' を返す
素直に最初から Perl の String#ord 持って来てりゃよかったのに
673デフォルトの名無しさん:2007/10/14(日) 20:44:23
>>672
甘い、甘すぎる
そこにもう一つ書いているだろ。
> ?c が 1文字の String を返すようになりました
つまり
> "a"という文字列から?aの値を得るにはどうすればいいのでしょうか
という題意なのだから"a"[0]== ?aなのは1.9でも満たされるのさ。
674デフォルトの名無しさん:2007/10/15(月) 11:40:48
>>673
酷い、酷すぎる
675デフォルトの名無しさん:2007/10/15(月) 19:12:19
Rubyってコード書くときに文字コードは何で書くのが一般的?
SQLやXML使うの考えたらUTF8で書いとけば無難かな?
676デフォルトの名無しさん:2007/10/15(月) 19:39:48
そのへんは必要な文字コードで書くべき
日本語EUCのファイルを読んで日本語の入った正規表現を扱うなら日本語EUCにしておいたほうが無難
正規表現の中の日本語部分だけEUC-JPで書いておくとか面倒で死ぬ
677デフォルトの名無しさん:2007/10/16(火) 01:47:23
初心者です。(OS:winXP)
Ruby(ver1.8.6)を使って、
手元のHTMLをIEで実行して、キャプチャして、保存して、縮小したいんです。
で、それをRuby On Railsでやりたいのですが、
良い方法ありますか?
678デフォルトの名無しさん:2007/10/16(火) 04:11:38
ttp://dip.picolix.jp/disp5.html

自力で作ることはそりゃ不可能ではないが現状自力で作れてない以上君には無理だ
(自力で作れるような人はそういう聞き方をしない)
ということで外部キャプチャプログラムに素直に頼るのが得策
CrenaHtml2jpgなら何もせずに動くし縮小まできちんとやってくれるぞ
(動画ソフトの入ってない純粋なW2kの人はGDI+が無いと言われる可能性が高いのでどっかからパクれ)
679デフォルトの名無しさん:2007/10/16(火) 04:48:57
677です。
早速の的確なアドバイスありがとうございます。
ttp://www.koders.com/ruby/fid4E269978EF1C5A7F0E606F8DF4831BAB5C002501.aspx
のcapture.rbをどうにかしてWebページの表示部分のみをキャプチャしたかったのですが、
ソースがさっぱりだったので、外部プログラムを使ってみます。
がんばってみます。
680デフォルトの名無しさん:2007/10/16(火) 07:30:52
WIN32APIでIEコンポーネントを使えば行けるだろ
681デフォルトの名無しさん:2007/10/16(火) 08:16:05
可能であることと自分で作れるかどうかは別物
682デフォルトの名無しさん:2007/10/16(火) 10:10:30
>>555
「使えない」ってどういう意味?
-K オプションを適切に指定していれば何の問題もなく使えてると思うんだけど?
683デフォルトの名無しさん:2007/10/16(火) 12:42:49
rubyで
case hoge
when a
do foo
when b
do foo
when c
do foo
end

のような処理をC風に
switch hoge
case a
case b
case c
do foo

のような感じで書きたい場合はどうすればいいのでしょうか
684デフォルトの名無しさん:2007/10/16(火) 12:49:17
>>683
a,b,c、全て同じ処理fooってこと?
それなら
case hoge
when a,b,c
 do foo
end

つかdoって何?
685デフォルトの名無しさん:2007/10/16(火) 13:05:16
>>684
カンマで区切ればいいんですね。
do fooってのはRubyとは関係なくて、ただfooをする(do)ってことを表すために書きました
686デフォルトの名無しさん:2007/10/16(火) 13:22:22
do は予約語なんで、例示に使うなら do_foo とかの方がベター。
687デフォルトの名無しさん:2007/10/16(火) 15:15:53
>>682
「ライブラリで」を見落としてるだろ。
688682:2007/10/16(火) 16:46:02
>>687
見落としてないよ。
689682:2007/10/16(火) 16:53:13
と思ったけど、確かに使えないな。何か根本的に勘違いしていた。スマソ
690デフォルトの名無しさん:2007/10/16(火) 19:46:38
ディレクトリ内のファイル一覧を配列で取得すると、"."とか".."とか親ディレクトリへのリンクも表示されちゃうんだけど
これを削除するにはこんな不恰好な感じでいいの?
なんか他にいい方法あるのかいな?

list = Dir::entries(".")
list.delete(".")
list.delete("..")
p list
691デフォルトの名無しさん:2007/10/16(火) 20:03:17
Dir::glob("*") とか
692デフォルトの名無しさん:2007/10/16(火) 20:07:03
ありがてぇありがてぇ・・・
693691:2007/10/16(火) 20:07:51
今リファレンス見て気づいたけど、
Dir[pattern] でもいいのか
694デフォルトの名無しさん:2007/10/16(火) 21:07:07
インクリメントとして「n++」とメソッド定義できないのでしょうか?

class Numeric
 def ++
  self += 1
 end
end

みたいな感じで。(上だとエラーでました)
695デフォルトの名無しさん:2007/10/16(火) 21:16:52
++と--の定義はユーザーレベルではできません
n+=1と素直に書いてください
696デフォルトの名無しさん:2007/10/16(火) 23:49:57
質問です。
Ruby/SDLをEclipseで動かしたいんですが
wikiで調べてそれらしいのがあったけど
リンク切れだった(´・ω・`)

どなたか、どうすればEclipseで動かせるのか
教えてもらえませんか?
697デフォルトの名無しさん:2007/10/17(水) 00:11:14
line = gets
if line =~ /\A\s+\n\Z/
 puts "it's null line!"
end
のというコードを実行して、先頭にスペースを適当に入れた後Enterキーを
押したらit's null line!というメッセージが表示されました。
\zならそうなるのはわかるんですが、リファレンスを見ると大文字のZの場合、
末尾に文字列があればその直前にマッチするということなので、
例えば入力がsss\n (sはスペース)
だった場合、\Zは最後のsと\nの間にマッチすることになるので
sss\nは/\A\s+\n\Z/とはマッチしないと思うんですが、どうしてマッチするのでしょうか?
698デフォルトの名無しさん:2007/10/17(水) 00:26:27
>>697
それはその記述がRuby1.6のもので君の実行環境がRuby1.8だからだろ

1.8では「\Zは改行の前と文字列の末尾の両方に直感的に(Perlのように)マッチする」と変更されたから
「\n\Z」は「改行があって文字列終了」に素直にマッチする
699デフォルトの名無しさん:2007/10/17(水) 00:32:00
>>696
どこでどう動かないのか書いてみればいいよ。Rubyが動かないのかRuby/SDLが
動かないのかEclipseが動かないのかとか。

>>697
http://www.ruby-lang.org/ja/man/?cmd=view;name=%C0%B5%B5%AC%C9%BD%B8%BD
> 常に文字列の末尾にもマッチするように変更されました。
ということ。
700デフォルトの名無しさん:2007/10/17(水) 00:32:52
マッチならいいけど置換が悲惨だな
って\Zで置換する奴はいないか

irb> str="line1\nline2\nline3\n\n"
irb> puts str.gsub(/\Z/,'<br>')
line1
line2
line3<br>
<br>
701デフォルトの名無しさん:2007/10/17(水) 00:37:26
そういうときは$で。
"line1\nline2\nline3\n\n".gsub(/$/, "<br/>")
=> "line1<br>\nline2<br>\nline3<br>\n<br>\n<br>"
702697:2007/10/17(水) 00:37:45
記述が古かったんですねorz
ちなみに参照したのはピッケル本の第二版p281でした
ありがとうございました
703デフォルトの名無しさん:2007/10/17(水) 00:53:43
>>701
期待される置換後文字列は
"line1\nline2\nline3\n\n<br>"
だと思う
いや、そこに<br>つけんのってナニって感じではあるけどさ

つまり\nの場所や数にかかわらず「文字列のとにかく最後にマッチ」
いや、正規表現でそこ置換するのってどうよって感じでもあるんだけど
704デフォルトの名無しさん:2007/10/17(水) 01:04:15
>>699
EclipseでRubyは正常に実行できるんですが
Ruby/SDLが動きません。

なにが必要なんでしょうか。
705デフォルトの名無しさん:2007/10/17(水) 01:07:03
>>704
お布施
706デフォルトの名無しさん:2007/10/17(水) 01:13:37
>>704です

すいません、Ruby/SDLをインストールしてませんでした。
お騒がせしてしまい申し訳ないです。
インストールしたらできるようになりました。
707デフォルトの名無しさん:2007/10/17(水) 18:48:05
getsやreadlinesを使って空の文字列を返させたい場合、どうすればいいのでしょうか?
708デフォルトの名無しさん:2007/10/17(水) 19:07:23
エスパー発動

>>707
String#chompで末尾の改行を削除することができる

while line=gets.chomp do
break if line.empty?
p line
end

709デフォルトの名無しさん:2007/10/17(水) 19:48:47
>>707
再定義
710707:2007/10/17(水) 22:56:30
標準入力からとつけるのを忘れてました。すいませんorz
他の言語だと空の文字列と偽が同じように扱われたりするので
ごっちゃになってたんですが、rubyだと完全に別物なんですね。ありがとうございました
711デフォルトの名無しさん:2007/10/18(木) 10:10:45
def hoge a, b, c
puts a, b, c
end

def age x
x * x
end

hoge age 1, age 2, age 3

これがシンタックスエラーになるのは何故なんでしょうか?
712デフォルトの名無しさん:2007/10/18(木) 10:20:08
エラー理由を一般化して「この場合はここが…」とか説明するのは無駄なので
(シンタックスエラーが出なかったとしてもそれは意図どおりパースされたことを保証しないから)

>>711
メソッド呼び出しの引数には必ずカッコつけろ
irbで打つの面倒なときだけは許す
713デフォルトの名無しさん:2007/10/18(木) 10:24:48
現行の実装の制限とかはひとまず置いといたとして、
>>711 みたいなのをエラーにならないようにするってできないのかなあ?
そもそも理論的に不可能? LALR(1) だから無理とかそういう感じ?
714デフォルトの名無しさん:2007/10/18(木) 10:27:13
足し算とか面倒そうだな>必ずカッコつける

hoge age(1), age(2), age(3)

これが見た目も妥当かね
これ以上減らすと「自分が意図したパース」と「Rubyが実際にしたパース」が食い違う危険性が増えると思う
715デフォルトの名無しさん:2007/10/18(木) 10:30:50 BE:1262592386-2BP(125)
+とか=とか以外はメソッド呼び出しには()つけてるなあ
あと、putsとかpもあまり付けないかな。

hoge(age(1), age(2), age(3))
と書くかな
716デフォルトの名無しさん:2007/10/18(木) 10:51:00
Winで改行コードがLFはだめ?

irb(main):001:0> io=File.open('test.txt')
=> #<File:test.txt>
irb(main):002:0> io.pos
=> 0
irb(main):003:0> io.eof?
=> false
irb(main):004:0> io.pos
Errno::ENOENT: No such file or directory - test.txt
from (irb):4:in `pos'
from (irb):4
from :0

ruby -v
ruby 1.8.6 (2007-09-23 patchlevel 110) [i386-mingw32]
717デフォルトの名無しさん:2007/10/18(木) 11:06:58
>>714
* 「文」に見える式はカッコつけない。
* それ以外の「一般的な式」に見えるならつける。
というところでどうかな。
要するに「値を使うときにはつけろ」。
718デフォルトの名無しさん:2007/10/18(木) 12:34:33
>>716
そこでエラーになるのはバグっぽいが、そもそもVCのテキストモードの設計は
tell/seekとは相性が悪いからなぁ。使わないほうが無難。
719デフォルトの名無しさん:2007/10/18(木) 14:45:35
def hoge x
x
end

puts hoge 5 + hoge 5

これもエラーになるのね。
引数と演算子の優先度が同じ?になってるのはなんでなんだろ
720716:2007/10/18(木) 15:03:51
CR+LFのファイルやLFでもbinmodeなら発生しない
LFのファイルだとCでもftellの値がおかしい
ということでCライブラリ?の問題みたいです。><
721デフォルトの名無しさん:2007/10/18(木) 15:27:13 BE:394560353-2BP(125)
>>719
演算子のように見えて、メソッドだったりするからなあ・・
722デフォルトの名無しさん:2007/10/18(木) 16:42:03
irb> 5.+(5)
10
723デフォルトの名無しさん:2007/10/18(木) 20:12:07
5 + 5 は演算子だけどね。
724デフォルトの名無しさん:2007/10/18(木) 20:23:27
今適当に
p (0..5).to_a
ってやったら
=>[0,1,2,3,4,5]
って配列ができて感動した
725デフォルトの名無しさん:2007/10/18(木) 23:53:14
>>723

class Fixnum
 def +(other)
  "Addition"
 end
end

p(5 + 5) #=> "Addition"
726デフォルトの名無しさん:2007/10/19(金) 00:31:29
演算子のように見えるようにしてあるだけでメソッドだったはず
んで = とか && とかはメソッドではなく制御構造
727デフォルトの名無しさん:2007/10/19(金) 00:34:46
普通にローカル環境で実行したスクリプトから
そのPCのリモートホストが取得したいんですが、どうやればいいのでしょうか?
今はとりあえず、外部鯖に置いたcgiにアクセスして
そのcgiが取得した環境変数の値を取得するという回りくどい事をやってます。
728デフォルトの名無しさん:2007/10/19(金) 00:49:35
>>727
例えば NAT(IPマスカレイド) の内側のホストを想定すると、
そういう情報そのものが存在しない。
729デフォルトの名無しさん:2007/10/19(金) 01:08:07
>>728
要するにムリって事でしょうか?
やはり外部にアクセスして間接的に取得するしかなさそうですね…
730デフォルトの名無しさん:2007/10/19(金) 01:12:08
>>727
リモート向けのIPアドレスを自力で調べることができるならresolv.rbでOK
それがなければどうしようもない
731デフォルトの名無しさん:2007/10/19(金) 01:31:30
>>725
わかんないかな。

演算子 + が内部で .+を呼んでるだけで、a + b自体は演算子なんだよ。
c.*a.+b

c*a+b
の結果が違うことからも明らか。
これでわからなかったらヤバイよ。
732デフォルトの名無しさん:2007/10/19(金) 01:39:44
h={:a=>1,:b=>2,:c=>{:x=>10,:y=>20}}
p h[:a] #=>1
p h[:c][:x] #=>10
p h[:c][:x][:y] #=>nil
p h[:d] #=>nil
p h[:d][:x] #=>nil
p h[:d][:x][:y] #=>nil

Hashクラスを拡張して↑のようにHashの入れ子の深さより深い要素に
アクセスするとnilを返すようにできますか?
733デフォルトの名無しさん:2007/10/19(金) 02:04:59
>>731
そりゃそーだけど、レクサが頑張った成果というか
>演算子 + が内部で .+を呼んでる
以上、一風変わったメソッド呼び出しだと思っておけば
変な再定義もしないんじゃないか。

>>725上でなんも考えずに>>731の式実行して
coerceあぼーんしたorzバカス
734デフォルトの名無しさん:2007/10/19(金) 02:08:34
>>727
リモートホストって何の事?ホスト名?IPアドレス?
require 'socket'
hostname = Socket.gethostname
ip_address = IPSocket.getaddress(hostname)

>>732
どうなっても知らんが
class NilClass
 def [](i) ; return nil ; end
end
735デフォルトの名無しさん:2007/10/19(金) 02:21:03
突っ込んだら負けかなと
736デフォルトの名無しさん:2007/10/19(金) 04:27:32
あーHashを拡張か

無理
737デフォルトの名無しさん:2007/10/19(金) 04:50:39
>>732
何のためにしたいのかは見当つかんけど、
とりあえずそんなややこしいデータ構造をHashの
入れ子だけで作るなってことだと思う。
738デフォルトの名無しさん:2007/10/19(金) 04:58:48
h[:c][:x][:y] の例でいくと、
h[:c][:x] で10が返ってるから、10[:y]が評価されてる
Hashの拡張云々の問題じゃない

[]メソッドの無いインスタンスはどうにでも出来るけど
739デフォルトの名無しさん:2007/10/19(金) 06:16:41
>>732
class Hash
 alias bracket []
 def [](i)
  val = bracket(i)
  unless val.respond_to?('[]')
   def val.[](i=nil) ; return nil ; end
  end
  return val
 end
end
740デフォルトの名無しさん:2007/10/19(金) 08:20:38
>>733
何を言いたいのかわからんけど、
719からのスレの流れだということを考えろ。

考えたか?
で、a + b はメソッド呼び出し式か?
741デフォルトの名無しさん:2007/10/19(金) 08:33:08
>>734
手元で試してみたけど、それだとリモートホスト(プロバイダ)のアドレスは返らなかった

>>739
なんという無茶スクリプトw そんなん初心者に勧めんな
ライブラリが軒並み動かなくなっても不思議じゃないぞ
Hash#[]が呼ばれるたびにメソッド再定義してるから、性能の問題もありそうだし
742デフォルトの名無しさん:2007/10/19(金) 10:27:53
>>727
P2P アプリケーションソフト (Winny とか?) なんかだと、
connection 張った相手から自分の IP アドレスを教えてもらったりするのがあるね。
外部鯖の CGI から取得というのは悪くない方法だと思う。

俺の場合は NAT してるブロードバンドルータの Web UI から
網側の IP アドレスを表示するページを GET して HTML をパースして
IP アドレスを得る Ruby スクリプトを作って使ってる。
743デフォルトの名無しさん:2007/10/19(金) 11:06:07
IPアドレスは/sbin/ifconfig(Win2k以降ならIPCONFIG)あたりから取得して正規表現で切り取ること
(そりゃioctl駆使して生で取得してもいいけどたぶん面倒)

require 'resolv'
addr=`/sbin/ifconfig ppp0`.scan(/:([\d\.]+)/)[0].to_s
puts Resolv.getname(addr)
744デフォルトの名無しさん:2007/10/19(金) 14:57:22
>>740
a = VM::InstructionSequence.compile("1 + 2").to_a
b = VM::InstructionSequence.compile("1.+(2)").to_a
p(a == b) #=> true
745デフォルトの名無しさん:2007/10/19(金) 15:17:36
いぇ〜い
RDEインストールしたので今日からプログラムべんきょうするぜ 
おまえらまず何すれば委員かおしえろ
まずどこのサイトよめばいいの
メソッドとかクラスとかも意味をしらないとこからはじめるんだけど
746デフォルトの名無しさん:2007/10/19(金) 15:27:12
>>745
IDEインスコしてから勉強しはじめるとは珍しいやつだな
>>5-6
見れ

まずはコレから
http://www1.tf.chiba-u.jp/~shin/tutorial/index.rb
退屈すぎと思ったらこういうのもある
http://www.aoky.net/articles/why_poignant_guide_to_ruby/
747デフォルトの名無しさん:2007/10/19(金) 15:31:28
>>746
そーなの?だってリナックはめんどいし
ウィンドウズでいちいちコマンドラインでやるのやだし
このソフトみっけてこれなら続くかなっておもったの

ありがとー
そのチュートリアルからみてくわ
748デフォルトの名無しさん:2007/10/19(金) 15:38:18
確かに "a + b" という演算子はないわな

    とかグダグダにしてみる
749デフォルトの名無しさん:2007/10/19(金) 17:50:36
moduleでインスタンス変数が使えるの変じゃね?
750デフォルトの名無しさん:2007/10/19(金) 17:55:02
Mix-in で利用する場合とか、インスタンス変数にアクセスできても全然変じゃないような。
751デフォルトの名無しさん:2007/10/19(金) 18:24:25
moduleの使い方にもよるかも
newしないからインスタンス無いじゃん?みたいな屁理屈は支持
752デフォルトの名無しさん:2007/10/19(金) 20:16:16
>>744
それは最適化の結果だろ・・・。

なんでこのバカわかんないのかな。

いいか、719からの流れをよく読んで、
でそれから a + bは、演算子式か、メソッド呼び出し式どっちか考えてみろ。
753デフォルトの名無しさん:2007/10/19(金) 20:25:17
まにゅあるに「ほとんどの演算子は特別な形式のメソッド呼び出しです」ってかいてあるんだからめそっどでいいじゃん
754デフォルトの名無しさん:2007/10/19(金) 20:31:16
論理的に考えることが出来ないのかお前。
755デフォルトの名無しさん:2007/10/19(金) 20:35:47
>>726
>んで = とか && とかはメソッドではなく制御構造
いくらなんでもそりゃねぇよ。
756デフォルトの名無しさん:2007/10/19(金) 20:43:23
>>753
お前そこ読んで、演算子式 == メソッド呼び出し式と主張してるの?

よく読めよ! 「特別な形式の」って書いてあるだろ! イコールで結べないだろ!
757755:2007/10/19(金) 20:49:42
ごめん。そんなことあった。
俺の不勉強でした。

てか、「=」と「.hoge=」って別物扱いだったんだな。
758デフォルトの名無しさん:2007/10/19(金) 20:54:55
>>756
じゃあ何なんだ
メソッド呼び出しではないとして何なんだ
「特別な形式のメソッドだけどこれはメソッドではありません」とでも主張するつもりか
メソッドじゃないなら特別な形式だろうがなんだろうがメソッドとはそもそも言えんのではなかろうか
759デフォルトの名無しさん:2007/10/19(金) 20:57:56
メソッドで表現された演算子です、という着地点はどうだろう


というか演算子じゃないと何か困る奴がおるのか
演算子が何かに従属した存在だと宗教上の理由で受け入れ難いとか
760デフォルトの名無しさん:2007/10/19(金) 21:06:04
はい
761デフォルトの名無しさん:2007/10/19(金) 21:07:41
おっぱっぴー
762デフォルトの名無しさん:2007/10/19(金) 21:10:49
>>758-759
やってる処理はメソッド呼び出しだが、「演算子」と「本当のメソッド呼び出し」では
文の中での評価順(読まれ方)が違う
そういうことだろう

つーかお前ら、ちゃんと>>719以降の流れと>>731読んでたか?
まぁ噛み付いてる側の発言にも問題があったとは思うけど
763デフォルトの名無しさん:2007/10/19(金) 21:26:51
いちいち煽り文にするからこじれるんだよ
764デフォルトの名無しさん:2007/10/19(金) 21:29:03
>>762
それは演算子というものの性質ではないと思う
765デフォルトの名無しさん:2007/10/19(金) 21:29:37
>>758-759
>メソッド呼び出しではないとして何なんだ
a + bは演算子なんだよ。

残り三行、何故>>719からの流れを読もうとしないの?

>>759
>メソッドで表現された演算子です、という着地点はどうだろう
>719からの流れから、「メソッドで表現された演算子です」なんて着地点に到達するなんてアホだよ。

>というか演算子じゃないと何か困る奴がおるのか
何言ってるんだ。逆だろ。
「お前が演算子じゃなくメソッド呼び出しだ」と主張してるんだよ?

つまり、それは俺が聞きたいわけ。「a + b が演算子だと何か困るのか?」
766デフォルトの名無しさん:2007/10/19(金) 21:36:54
もうどうでもいい。
匿名掲示板で喧嘩腰で吠えるのは不毛だからやめとけ。
767デフォルトの名無しさん:2007/10/19(金) 21:38:10
なら黙ってればいいのに。どうでもいいことに口を挟むのは不毛だからやめとけ。
768デフォルトの名無しさん:2007/10/19(金) 21:42:06
だから不毛とか禿げの俺がいる前で(ry
769デフォルトの名無しさん:2007/10/19(金) 21:45:54
>再定義できる演算子(メソッド)
>再定義できない演算子(制御構造)
って公式で言ってんだから、それ以上でもそれ以下でも無いだろ。
「+」が演算子かメソッドかで言ったら
「演算子で、かつメソッド」なんだろ。

それで文句あるヤツは、ここで言ってないで公式サイトに言いに行けよ。
770デフォルトの名無しさん:2007/10/19(金) 21:48:04
>>769
「最終的な結果は」そのとおり。

しかし、パースのされ方、評価の過程が違う。

そして、>>719は過程を問題にしてる。なんでわからないのかな。
771デフォルトの名無しさん:2007/10/19(金) 21:51:33
Klass#+ ←メソッド

a = Klass.new
a.+(b) # ←Klass#+というメソッドの普通な呼出し
a + b # ←Klass#+というメソッドの特別な呼出し

じゃねーの?
a.+(b) も a+b も呼出しであってメソッドではないんでね?
772デフォルトの名無しさん:2007/10/19(金) 22:00:08
んで >>719 なんだけど
式を書かなければならないところで普通のメソッド呼出しをする場合は
引数を括弧で囲まなきゃいけない、っていう話じゃないの?
優先順位とか以前に文法上誤りじゃね?
773デフォルトの名無しさん:2007/10/19(金) 22:08:37
だよな
話が変な方向にこじれた
774デフォルトの名無しさん:2007/10/19(金) 22:21:01
要するに、使い勝手の悪い言語なんですね。
775デフォルトの名無しさん:2007/10/19(金) 22:39:28
初歩的な質問ですみません。
String#to_iだと整数化したのを返すだけでレシーバ自体はそのままのようですが、
to_i!みたいに自身を変換するメソッドってないのでしょうか?
↓のs = s.to_iみたく自分に代入するしかない?

s = "11"
n = s.to_i
puts n.class # => Fixnum
puts s.class # => String
s = s.to_i
puts s.class # => Fixnum

776デフォルトの名無しさん:2007/10/19(金) 22:56:37
Ruby標準ではselfのオブジェクトを明示的に変換するというメソッドはあまり無いっす
s= s.to_i とか書いて変換してくだしあ
777デフォルトの名無しさん:2007/10/19(金) 23:02:01
結果のクラスも同じなら破壊的なメソッドは結構あるんだけど
結果のクラスが変わってしまうのはほとんど無いと思う
778デフォルトの名無しさん:2007/10/19(金) 23:03:06
つーか、演算子には優先順位があるだろ。
ただのメソッド呼び出しとは決定的に違う。
779775:2007/10/19(金) 23:13:08
>>776,>>777
そうなんですか。
クラスが変化する破壊的メソッドがほとんど無いというのは勉強になりました。
str.to_i.to_s.to_iでもstr自体は何も変わってないのですね
780デフォルトの名無しさん:2007/10/20(土) 00:27:52
ピッケル本第二版のP294を見ると=は+よりも優先度が低いみたいなんですが
それなら何故
1+x=3
という式はエラーにならないのでしょうか?
(1+x) = 3
という風に解釈されると思うんですが
781デフォルトの名無しさん:2007/10/21(日) 00:22:55
module Hoge
def nya
'にゃ'
end

def run
puts nya
end
module_function :run
end

Hoge::run

> hoge.rb:7:in `run': undefined local variable or method `nya' for Hoge:Module (NameError)
困ってます
あまり解決がめんどくさいようならHogeはモジュールでなくクラスにしてもいいっちゃいいんですが
でもできればモジュールのままでrunだけいわゆるパブリックにしたいです
782デフォルトの名無しさん:2007/10/21(日) 00:46:29
module Hoge
def Hoge.nya
783デフォルトの名無しさん:2007/10/21(日) 01:00:06
>>782
それだとnyaもパブリック扱いになってるじゃん
784デフォルトの名無しさん:2007/10/21(日) 01:17:56
moduleはincludeしないときは使わない
無理してでもクラスとクラスメソッドにしとく

>>781みたいなことがあってよくわかんなくて理解諦めた
自分で使うだけだし厳密にやる必要もないかなみたいな
785デフォルトの名無しさん:2007/10/21(日) 01:27:45
>>781
これでどう?

def run
extend Hoge
puts nya
end

ただ、 >>784 も書いているけど
include される見込みがないのなら
module にするメリットはあまりないと思うよ。
786781:2007/10/21(日) 02:49:06
じゃあモジュールやめてクラスにしてクラスメソッドの集団にします

「インスタンスを作る理由がないからクラスじゃなくモジュールにするんだよー」という考え方は
それはそれでとても一理あるとは思うんだけど
787デフォルトの名無しさん:2007/10/21(日) 03:37:51
>>786
そもそもなんでnyaがパブリックではいけないんだ
本当にインスタンスを作る必要がないのか?
788デフォルトの名無しさん:2007/10/21(日) 03:44:16
単にクラスメソッドからはインスタンスが必要なメソッドを呼べないだけじゃないの?
モジュールをクラスに変えても、この問題はあまり解決にならないような。

private、publicにこだわるなら、こうじゃない?

module Hoge
def nya
'nya'
end

def run
puts nya
end
module_function :run,:nya
private_class_method :nya
end

Hoge::run
789デフォルトの名無しさん:2007/10/21(日) 03:53:51
>>787
横槍だけど、まぁ、単にネームスペース的に使いたいことはある。
Rubyの作法としてそういうモジュールの使い方が
いいのか悪いのかは、良く分からない。
790デフォルトの名無しさん:2007/10/21(日) 04:50:12
まあ、そんなこと言ったらプライベートメソッドとかインスタンス変数の外部からの参照とか
そういうのは全通しにしておいて使うとき気をつければいいじゃん、みたいな話になり
それってつまりグローバル変数であんなに困った過去忘れちゃうってこと?みたいな
791デフォルトの名無しさん:2007/10/21(日) 11:16:18
はじめたばかりの素人です。
CGIをRubyで動かそうと思ってCGIファイルの
頭に#!ruby/bin/rubyを書いてみたんですが、
Rubyで動かず#!ruby/bin/rubyがそのまま表示されてしまうんですが
なにがおかしいのでしょうか?
792デフォルトの名無しさん:2007/10/21(日) 11:25:00
実行権限を与えてないのでは。
793デフォルトの名無しさん:2007/10/21(日) 11:29:52
>>792
おそらく、それだと思います。
具体的にはどうれば良いか聞いてもいいですか?
794デフォルトの名無しさん:2007/10/21(日) 11:40:36
>>793
まずは自分で勉強しろ
ttp://jp.rubyist.net/magazine/?0011-CGIProgrammingForRubyBeginners

あと質問するときは環境(使用しているサーバー、rubyのバージョンなど)を書くこと
そうしないと答える側も答えようがない
795デフォルトの名無しさん:2007/10/21(日) 11:50:59
>>794
ありがとうございます。まずそちらのサイトで調べてみます。
分からなければ、次は詳細を付記してまた質問させていただきます。
796780:2007/10/21(日) 12:14:39
誰か>>780もお願いしますorz
それともこういう質問はruby-listで聞いたほうがいいんでしょうか?
797デフォルトの名無しさん:2007/10/21(日) 13:38:34
>>796
たしかに仕様に関することはruby-listで聞いた方が返事がはやいかも。
798デフォルトの名無しさん:2007/10/21(日) 14:06:04
xはメソッドである+の引数だからじゃないの?
とP293を読んで思った。
799デフォルトの名無しさん:2007/10/21(日) 14:10:53
1.+(x=3) #=>4
800デフォルトの名無しさん:2007/10/21(日) 14:24:26
「処理なメソッドをまとめた」だけのクラスメソッドだけのクラス作るとき
runメソッドを作ってて「ここ nya メソッドにして括り出そう」と思ったら

def Hoge.nya

と書かないとダメっぽいのがとてもイヤ(いや、他の方法もあるけどさ)
や、普通に def nya って書いたらインスタンスメソッドで
クラスメソッド使うぶんにはインスタンスが無いから動かないんだよね
理屈はなんとなくわかるけど、でも書くのちょう面倒
801デフォルトの名無しさん:2007/10/21(日) 15:09:40
def self.nya
じゃだめなぬか?

#他の方法とはこのこと?
802デフォルトの名無しさん:2007/10/21(日) 15:16:45
>>800
モジュール関数(module_function)にすれば書く必要なくなるよ
803デフォルトの名無しさん:2007/10/21(日) 16:31:33
わりとどーでもいいことなんですが
$DEBUG=trueだと、PStore使用時に

`Errno::ENOENT' at /usr/lib/ruby/1.8/pstore.rb:111 - No such file or directory - /hoge/data.pstore.new

という例外がいちいち表示されます
実害はないので無視してますが微妙にウザいです
これだけを一発で抑制する方法とかないでしょか
Errno::ENOENTなのでrescueで捕捉して一律無視するのは開発中はちょっと怖いです
804デフォルトの名無しさん:2007/10/21(日) 17:15:09
ruby 特定の例外を捕捉

でググル
805デフォルトの名無しさん:2007/10/21(日) 18:25:36
>> 800

class Hoge
end

class << Hoge
 def run
  nya
 end
 
 def nya
 end
end

という書き方はどうでしょう。
806デフォルトの名無しさん:2007/10/21(日) 20:09:09
>>799
演算子の順位が + > = なんだから
1+x
のほうが先に評価されるはずじゃね?

と789が申しておりマス
807デフォルトの名無しさん:2007/10/21(日) 20:11:30
256倍本の無道編P58のスキャナで、文字列を取りだすために使われている
正規表現
/\A"(?:[^"\\]+|\\.)*"/
について質問なんですが、後半の|\\.はどういう意味なんでしょうか?
808デフォルトの名無しさん:2007/10/21(日) 20:47:23
または、円記号そのものに続けて任意の一文字
典型例としては "abc\ndef" みたいなのを念頭に置けばいいんじゃまいか
809デフォルトの名無しさん:2007/10/21(日) 20:53:04
>>806
代入について
左辺値がオブジェクト属性の場合は、対応する属性設定メソッドが右辺値を引数として
レシーバ内で呼び出されます。
(ピッケル本P293)
810デフォルトの名無しさん:2007/10/21(日) 21:19:24
x<y<z
とか
4<x<6
のような式をかけないのはどんな理由からなんでしょうか?
811デフォルトの名無しさん:2007/10/21(日) 21:35:55
>>810
X=5の場合
4<x<6 → (4<x)<6 → true<6 → エラー
だからじゃね?
812デフォルトの名無しさん:2007/10/21(日) 21:36:42
+ よりも優先度が低い<<の場合は
1 + 3 << 2
でちゃんと1+3のほうが先に計算されるね
813デフォルトの名無しさん:2007/10/21(日) 21:48:44
「そういうふうに作ってないから」以上のなにものでもないなw
というか三項比較が式としてそのへんに書ける言語って少なくね?
814デフォルトの名無しさん:2007/10/21(日) 21:51:27
書ける言語ってどんなのがあるの?
815デフォルトの名無しさん:2007/10/21(日) 21:55:39
irb> (4 .. 6) === 5
true
irb> a=4.1; b=6.2
irb> (a .. b) === 5.5
true

Rubyでは範囲オブジェクトを使ったり使わなかったりする
816デフォルトの名無しさん:2007/10/21(日) 21:56:45
pythonは書ける
817デフォルトの名無しさん:2007/10/21(日) 21:59:26
>>809
それは回答になってなくね?その説明は演算子の順位とはまったく絡まない話ではないかい?
818デフォルトの名無しさん:2007/10/21(日) 22:07:08
>>817
演算子の順位以前の文の評価レベルの話だといことではあるまいか

"abc"+x="def" #=> "abcdef"
"abc".+ x="def" #=> "abcdef"
1+x=3 #=> 4
1.+ x=3 #=> 4
819デフォルトの名無しさん:2007/10/21(日) 22:10:56
>>780
マニュアルのBNF風文法から

EXPR : MLHS `=' MRHS
たぶんこれが代入。MLHSは還元していくと

LHS : VARNAME
| PRIMARY `[' [ARGS] `]'
| PRIMARY `.' identifier

のリストに落ち着く。
1+x=3は1+xが左辺値じゃないので字句解析の段階で明らかに
1+(x=3)だとわかる…からだと思う。自信なし。
820デフォルトの名無しさん:2007/10/21(日) 22:26:04
1+x=3

左から評価してくと
+は1(Fixnumオブジェクト)のメソッドである
xは+メソッドの引数である
>>809から
xの右に=があるので+メソッドは=の右辺値の3を引数として呼び出す
となるのではないでしょうか?自信なし。
821デフォルトの名無しさん:2007/10/21(日) 22:32:14
>左辺値がオブジェクト属性の場合は
hoge.x = 3はhoge.x=を呼ぶよー、ってことで
>>809>>780にはあんまり関係ないっぽい。

優先度のほかに、+やらは左結合で
=とかは右結合とかもなんかなかったっけ?

ここのいちばん下。
ttp://www.loveruby.net/ja/rhg/book/yacc.html
822デフォルトの名無しさん:2007/10/21(日) 23:23:50
初期化時以外で
hash[1] = "a"
hash[2] = "b"
hash[3] = "c"
みたいな処理を短くスパっとやる方法はないでしょうか?
823デフォルトの名無しさん:2007/10/21(日) 23:31:37
>>822
基本的にありません
わざとらしい配列を変換するかeachでブン回してください
Hashのマニュアル参照
ttp://www.ruby-lang.org/ja/man/?cmd=view;name=Hash
824デフォルトの名無しさん:2007/10/21(日) 23:31:55
>>819
字句解析の段階でそんなことがわかるはずがない。

>>821
右結合か左結合か、そんなの関係ない。
右結合か左結合かは同じ優先順位の演算子の場合にしか意味が無いから。
825デフォルトの名無しさん:2007/10/21(日) 23:41:51
>>780
lhs : variable
  | primary_value '[' opt_call_args rbracket
  | primary_value '.' tIDENTIFIER
  | primary_value tCOLON2 tIDENTIFIER
  | primary_value '.' tCONSTANT
  | primary_value tCOLON2 tCONSTANT
  | tCOLON3 tCONSTANT
  | backref


arg : lhs '=' arg
  | lhs '=' arg modifier_rescue arg
  | var_lhs tOP_ASGN arg
  | primary_value '[' opt_call_args rbracket tOP_ASGN arg
  | primary_value '.' tIDENTIFIER tOP_ASGN arg
  | primary_value '.' tCONSTANT tOP_ASGN arg
  | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg
  ...
  | arg '+' arg
  | arg '-' arg
  ...
  | primary

1 + x は 上のとおり、arg である。
しかし代入の左辺には、lhs しかこれない。
arg は無条件で lhs に還元されることはない。 
よって、 1 + x = 10 が (1 + x) = 10 と解釈はされない。
x = 10 は上の通り、argになる。よって、 x = 10 は argとなり、 1 + arg となる。
なので、 1 + x = 10 は 1 + (x = 10) となる。
826デフォルトの名無しさん:2007/10/21(日) 23:44:40
>>818
>演算子の順位以前の文の評価レベルの話だといことではあるまいか

ちがうんじゃね?
評価は構文解析が終わったあとにしかできない。
そして構文解析をするときに演算子の順位が必要。

それから「代入式の左辺がオブジェクトの属性の場合...」うんぬんの話も、
構文解析のあとの意味解析での話。
だからこれも構文解析には関係ない。

構文解析では 1 + x = 3 を (1 + x) = 3 なのか 1 + (x = 3) なのかを演算子の順位をもとに決めるだけ。
オブジェクトの属性かどうかなんてこの段階ではわからない。
だから '+' > '=' のはずなのに 1 + (x = 3) と構文解析されるのならおかしいと思う。
827デフォルトの名無しさん:2007/10/21(日) 23:48:12
>>825
なるほど!

といいたいことろだが、さっぱりわからん。
この説明でみんなわかるのだろうか。。。自身なくなった
828デフォルトの名無しさん:2007/10/21(日) 23:48:30
>>822
基本的にあります。

hash.replace({1=>"a", 2=>"b", 3=>"c"})

Hashのマニュアル参照
ttp://www.ruby-lang.org/ja/man/?cmd=view;name=Hash
829デフォルトの名無しさん:2007/10/21(日) 23:56:30
>>823 >>828
>>822の説明が微妙に足らんのだな
ハッシュを直に書いていいのなら>>828がオブジェクトも変わらず便利
キーや値が配列か何かに格納されてるのならマニュアルにあるみたいなのしかないな
830デフォルトの名無しさん:2007/10/21(日) 23:59:36
>>824
構文解析でした、吊ってくる
831デフォルトの名無しさん:2007/10/22(月) 00:08:16
>>827
代入は 「左辺 = 引数」 という形でしか、構文木が作られないの。
そして、+演算子の式は 「引数」であって「左辺」ではないの。 

+の方が優先順位が高いんだけど、そもそも「BNFの定義」的に、
((1 + x) = 10) というパースはありえなく、そういう構文木が作られることもないんだよ。

一方、 x = 10 は 「引数」になることが出来るんだ。
だから、 (1 + (x = 10)) というパースは可能で、構文木も作ることが出来るんだ。


エラーになる言語の場合、 ((1 + x) = 10) で構文木が作られちゃって、
その後の意味解析で弾いてるからなんだね。
832822:2007/10/22(月) 00:10:21
すいません説明不足でした。orz
初期化以外でと書いたのは
hash[1] = "a"
hash[2] = "b"
hash[3] = "c"
の前に
hash["hoge"] = 30
hash["age"] = [1,2]
のように、その前にいくつかのキーと値がセットされている状態で、ってことです。
replaceだとこれらが消えちゃうみたいなのでやっぱり一行ずつ書くしかないですね。
833デフォルトの名無しさん:2007/10/22(月) 00:12:43
>>832
mergeでなんとかなる話?

hash.merge!({1=>"a", 2=>"b", 3=>"c"})
834822:2007/10/22(月) 00:18:43
>>833
なりました。ありがとうございます
835デフォルトの名無しさん:2007/10/22(月) 00:19:49
それにしてもHashの初期化は、他のオブジェクトと比べて書くの面倒だ
早く1.9で簡易記法採用されないかなぁ
836デフォルトの名無しさん:2007/10/22(月) 00:28:53
Rubyとはあんまり関係なさそうなんですが
&&と||の優先順位が異なるのは何故なんでしょうか?
837デフォルトの名無しさん:2007/10/22(月) 00:59:11
>>836
そりゃ集合論の話で、仮に優先順位が同じなら
どんあ不都合があるかを考えれば分かる
838デフォルトの名無しさん:2007/10/22(月) 01:15:27
>>833
> merge!
わかりにくいのでハッシュの追加はupdateと書くように
839デフォルトの名無しさん:2007/10/22(月) 04:22:20
>>833
その{と}はいらない。

>>835
あれはキーがシンボルの場合だけだから、>>832では使えないだろ。
840デフォルトの名無しさん:2007/10/22(月) 09:33:00
>>839
> その{と}はいらない
ハッシュにハッシュだから書いたほうがよいと思う。
省略するほうが却って意味がわかりにくい。ブロックを渡してるように見える場面でもないし。
何が何でもキーワード引数ごっこでオナニーするのはやめとけ。
841デフォルトの名無しさん:2007/10/22(月) 11:09:03
>>831
丁寧な説明ありがとう。「引数」といわれるから分かんなかった。
「引数」を「式」だとすると、
* 通常の2項演算子はBNFで「式 : 式 '+' 式」とか「式 : 式 '*' 式」と定義される。
* しかし代入式は「代入式 : 左辺値 '=' 式」と定義される。
* そのため、「1 + x = 10」は演算子の優先順位がでてくることもなく「1 + (x = 10)」と解析される。
* もし代入式が「代入式 : 式 '=' 式」と定義されていたら、「1 + x = 10」は演算子の優先順位により「(1+x) = 10」と解釈される。

なるほどー、これですっきりした。説明さんくす。
個人的にはRuby方式はやだなー。「1+x=10」が意味解析でエラーになってほしいわ。
842デフォルトの名無しさん:2007/10/22(月) 11:14:31
厳密なのが大好きな人はOCaml等を使ってください。
それっぽく書けばそれっぽく出来るのがRubyのいいところ。w
843デフォルトの名無しさん:2007/10/22(月) 12:27:42
nilとfalseの違いってなんなんでしょうか?
844デフォルトの名無しさん:2007/10/22(月) 12:43:05
>>842
「それっぽく書く」にも限度があるし
そもそも式の意味通りの動きが出来てないじゃねーか
1+x=10と入力したらx=10になってるんだから

>>843
俺の理解では
falseはtrueと合わせて真偽値の偽、つまり「間違ってる」とか「失敗した結果」を表す
対してnilは「無いこと」を表す。0や空文字列みたいなもの

スクリプト上での動作にはあんまり差はない
845デフォルトの名無しさん:2007/10/22(月) 14:07:34
> スクリプト上での動作にはあんまり差はない
いや、けっこう差はあるだろ

ただ、おそらくは一番利用されるであろう if で
irb> puts 'OK!' if nil

irb> puts 'OK!' if false

irb> puts 'OK!' if 0
OK!
irb> puts 'OK!' if ''
OK!
irb> puts 'OK!' if []
OK!

と nil と false の2つをいわゆる偽と扱ってるんで理解に混同が起こる
846デフォルトの名無しさん:2007/10/22(月) 14:12:07
irbの出力について教えてください。
結果が表示されるときの「=>」は何を意味しているのですか?

たとえば
irb(main):005:0> 3 + 4
=> 7
は計算結果を表していると思うのですが,

irb(main):004:0> puts 3 + 4
7
=> nil
は,計算結果がputsで出力され「nil」は何を表している?
847デフォルトの名無しさん:2007/10/22(月) 14:27:15
>>846
考え方が根本的におかしい

irb(main):005:0> 3 + 4
=> 7

3 + 4 を計算し、その結果の値 7 を irb が表示している

irb(main):004:0> puts 3 + 4
7
=> nil

3 + 4 を計算し
その結果の値 7 を puts が表示し
その(putsの)結果の値 nil を irb が表示している
848デフォルトの名無しさん:2007/10/22(月) 14:30:04
>>846
nilはputsの返り値でしょ。
a = puts 3+4 # => 7
p a # => nil

イメージ的にはこんな感じ?
def puts(str)
 print "#{str}\n"
 return nil
end

CやJavaでいうvoid型じゃないの?
849デフォルトの名無しさん:2007/10/22(月) 14:47:54
> CやJavaでいうvoid型じゃないの?

激しく違う

関数(メソッド)に対する void は「引数を取らないor値を返さない」
という宣言で、void型の値、というものは存在しないし、

C の void * は、ワイルドカードなポインタ型、という位置付けで、
Java の Object みたいな物で、この void はどんな型でも、という
宣言のようなもの。
850346:2007/10/22(月) 15:03:24
>>847,848

それで,結局「=>」は何を意味したプロンプトなんですか?
851デフォルトの名無しさん:2007/10/22(月) 15:06:48
>>847-849
おまえら回答になってなくねぇ

>>846
入力した式の戻り値が=>で表示される
852デフォルトの名無しさん:2007/10/22(月) 15:09:18
そもそもプロンプトじゃない
ttp://eow.alc.co.jp/prompt/ より「コンピュータがユーザに対して入力を促す記号」。入力を促す記号じゃない)
irb が、入力を評価した結果の値を返す際のマーカーである

というのが答え
853346:2007/10/22(月) 15:30:15
>>851
>>852

どうも,質問に応じた回答をありがとうございました。
854848:2007/10/22(月) 15:49:48
>>849
書き方悪くてスマン
void型というよりvoid型の代わりというべきだったか?
Rubyのメソッドはreturnなくても最後の式の値を返すから、
値を返さないという意味でnilを返してる、のつもりだったのだがまだ違うかな

リファレンスマニュアルみると
>>最後の式が(whileなど)値を返さない式の場合は nil を返します。
なってた
855デフォルトの名無しさん:2007/10/22(月) 16:22:09
>>854
意図して明示的に nil を返す場合もあるわけで、
void 型 (の代わり) と言ってしまうのは例え話としても乱暴すぎる気がします。

てか、普通に「NULL みたいなもの」でいいような。
856デフォルトの名無しさん:2007/10/22(月) 16:49:55
>>855
意図して明示的にnil返す、のはもちろん含んでません

void型と書いたのはputsみたいに戻り値が(多分)不要なのに最後の値を勝手に返さないようにする意味でnil返すのでは、と言いたかっただけなのです。

でも何か気持ち悪い?
if puts(3+4) == true
 puts "puts成功"
else
 puts "puts失敗"
end

結果
7
puts失敗
857デフォルトの名無しさん:2007/10/22(月) 17:01:29
たとえ話の正確性でもめんなw
858デフォルトの名無しさん:2007/10/22(月) 17:34:26
859デフォルトの名無しさん:2007/10/22(月) 19:27:44
変数名とメソッド名は全部小文字でアンダーバー区切りですよね
camelCaseなんて使いませんよね
860デフォルトの名無しさん:2007/10/22(月) 19:50:14
やだ・・・あたしは使っちゃう・・・
861デフォルトの名無しさん:2007/10/22(月) 19:58:14
>>859
VBの嫌な記憶があるから使わない
862デフォルトの名無しさん:2007/10/22(月) 20:05:10
cmd_OpenFile
cmd_CLoseFile

とかはやっちゃう
おれっち的には超COOLな感じなんだけどだめかな
863デフォルトの名無しさん:2007/10/22(月) 20:18:08
cmdナントカ(笑)
864デフォルトの名無しさん:2007/10/22(月) 20:24:27
>>862
確かに凍りつくくらい超COOLだ

cmd_Open_Fileとかごっちゃになって間違わない?
865デフォルトの名無しさん:2007/10/22(月) 20:51:06
Rubyでインテリセンスが出来るソフトはありますか?
866デフォルトの名無しさん:2007/10/22(月) 20:56:15
>>865
NetBeansがインテリセンス出たよ
867デフォルトの名無しさん:2007/10/22(月) 21:06:35
>>859
Ruby/SDLなんかのAPIを見ると、camelCase派もいるのかもしれない

だが>>862は理解不能だ
868デフォルトの名無しさん:2007/10/22(月) 21:09:25
CGI.escapeHTML
869デフォルトの名無しさん:2007/10/22(月) 21:17:04
>>868
それはCGIとHTMLがいわば固有名詞だからだ
せめてCgi.escapeHtmlになったときに持って来い

あと普通に通常に使用するメソッド名にcmdとかつけるのは
変数にarr_hogehogeとかデータ形式表すプレフィクスつけるのと同レベルで禁止な
open_xxxfileとかxxxfileとかでいいじゃん
870デフォルトの名無しさん:2007/10/22(月) 21:20:36
じゃあ恥ずかしいから全部メソッド名書き換える!
871デフォルトの名無しさん:2007/10/22(月) 21:59:35
>>868
escapeHTMLもはっきり言ってダサい
他のメソッド(CGI含む)に大文字が入ってないのに、なんでこれだけ大文字になってるのかと
俺は以前CGIスクリプト書くとき、最初の方で必ずescape_htmlを定義してた

cgi.rbの置き換えはいつ行われるのだろうか……
872デフォルトの名無しさん:2007/10/22(月) 22:07:23
>>871
> cgi.rbの置き換えはいつ行われるのだろうか……

たまには webrick/cgi のことも思い出してください。
873デフォルトの名無しさん:2007/10/22(月) 22:23:35
思い出して欲しけりゃ適度にわかりやすいマニュアルとcgi互換の解説を書くんだな
874デフォルトの名無しさん:2007/10/22(月) 22:36:48
>>872
使いやすいのは間違いないけど、マニュアルの少なさ以前に
あれcgi.rbと比べて異様に知名度が低いんだ
俺は4年目でようやくwebrickの存在を知った(るびまのおかげで)

いっそのことcgi.rbをobsoleteにして
webrick/cgiをRubyでの標準扱いにしてくれたらいいのに、と思う
875デフォルトの名無しさん:2007/10/22(月) 22:58:50
うぇーびっくり
876デフォルトの名無しさん:2007/10/22(月) 23:00:57
webrickはプロクシの作成方法しか無いぞぶっちゃけ
877デフォルトの名無しさん:2007/10/22(月) 23:03:46
定数のアクセスが::なのはどうしてなんでしょうか?
878デフォルトの名無しさん:2007/10/22(月) 23:14:23
>>877
「どうしてクラスやモジュールを呼び出す文法といっしょなんでしょうか?」という疑問なら
「クラスやモジュールはRubyでは定数と一緒だから定数と同じアクセス方法を用いる」という答になるかと

なんでコロンを2つ繋げた記法なんですかという疑問なら「うっせー文句言わず使え」とかそんな答
879デフォルトの名無しさん:2007/10/22(月) 23:39:16
>>874
webrick/sessionがないと移行できないよ。
880デフォルトの名無しさん:2007/10/23(火) 01:15:52
Ruby関係ないしレス書いてる途中でどうでもよくなってきたので悩まず答えてくれるといいんだけど

[{title=>タイトル, author=>著者, category=>カテゴリ番号}, ...]
という書籍データがハッシュで大量に格納されてる配列arrがあって
カテゴリ番号配列.each do |category|
bookdata = arr.find_all{|e| e['category'] = category}

end
という感じで「カテゴリ番号に一致する書籍のハッシュ」を抜き出したんだ
bookdataってとこの変数名を何にしたらわかりやすいかな?
「マッチするデータを抜き出したもの」のいい名前ってどうにも思いつかない
毎回変な名前になって「これ何だっけ?」とか読み返したとき悩む
881デフォルトの名無しさん:2007/10/23(火) 01:20:06
match
category_match
882デフォルトの名無しさん:2007/10/23(火) 01:20:50
catogolizeddata
883デフォルトの名無しさん:2007/10/23(火) 01:21:14
あ、lとr間違えた orz
884デフォルトの名無しさん:2007/10/23(火) 01:25:21
>>880
どうでもいいならそんなゴミ書き込まなきゃいいだろ・・・
つかコメントをちゃんと入れておけば解決する
885デフォルトの名無しさん:2007/10/23(火) 01:26:39
matched_list
founds
matched_books

ブロックが短いなら素直にlistとかdataとかでいいと思うよ

>>884
コメントを入れれば何でも読みやすくなると思うな
名前は超重要だぞ
886デフォルトの名無しさん:2007/10/23(火) 01:26:57
>>883
oとeも間違えてるよw
cat"o"golizeddata
887デフォルトの名無しさん:2007/10/23(火) 01:28:19
コメントつけた場所のずっと後ろで使う場合もあるからな
888デフォルトの名無しさん:2007/10/23(火) 01:39:49
ていうか「コメントつければわかる」ってめちゃくちゃ思考停止じゃないか
何のために変数名にアルファベットとアンダースコアの長大な文字列を許してるんだよ
つけられた名前を見ただけでメソッドの動作や変数の内容がわかるってのが本義だろ
わかりやすい名前はコメント以上の価値がある
889デフォルトの名無しさん:2007/10/23(火) 01:52:38
matchは正規表現のマッチと紛らわしいな
String#scanを使わないのにscanned_dataって書くのと似たような息苦しさを感じる

ということでpickedという形容詞はどうだろう
890デフォルトの名無しさん:2007/10/23(火) 02:12:59
>>888
俺もそう思う。
変数名とかメソッド名だけで分かるのが理想。
そうやって名前に気を使うと覚えやすくなるし。
891884:2007/10/23(火) 04:14:39
>>888
思考停止っすかw
長大な変数名ばかりのコード読めば判ると思うよ
まぁそういう変数名使う人間は大概コメントすら書けないんだけどね・・・
892デフォルトの名無しさん:2007/10/23(火) 04:46:25
短くて判りやすい名前を使いたい!
 ↓
かぶる
 ↓
処理をこまめにメソッドに分ける
 ↓
コメントがいるほど読みにくくないし、ユニットテストもできる
 ↓
ウマー
893884:2007/10/23(火) 05:16:19
>>892
>>887読めば判るでしょ、そもそも普通に書いてれば>>880で「これ何だっけ?」ってならないし・・・
BetterPerlって言われる意味がよくわかったわ
894デフォルトの名無しさん:2007/10/23(火) 09:26:55
>>893
「リファクタリング」を読むと良いよ。
895デフォルトの名無しさん:2007/10/23(火) 09:55:12
思考停止だと思うぞ
「ちょうどよい」の探求を放棄してるんだものね

「昔のPerlの書き方」から本当に抜け出せてないのは>>893のほうかも
896デフォルトの名無しさん:2007/10/23(火) 10:43:18
「○○して××を△△した配列とアレの配列を合わせた配列ただしゼロは入ってない」をローマ字で入力したような変数名を見たとしても
だからといって意味付けされた変数名の使用を止める気はない

変なユーザーがいるからといってRuby使用を止めない程度には
897884:2007/10/23(火) 19:41:27
>>894
>>>887読めば判るでしょ
はそのレベルだから変数名が長くなるって意味として書いた。
リファクタは>>880,>>887に教えてあげてくれ

>>895
>>880でブロックを小さく出来ない方が思考停止
>>885の言うようにlistとかdataとかで十分。あ、itemが好きかも
898デフォルトの名無しさん:2007/10/23(火) 20:17:39
>>891
で、その「長大な変数名」とやらはどんな名前だったんだ

>>893
「これ何だっけ?」となるのは、たいてい変数名が端的過ぎる場合
長くて適切な名前つけてれば後で読んでも意味が通る
899デフォルトの名無しさん:2007/10/23(火) 20:17:52
なんか鯉のぼりみたいだな
900名無し募集中。。。:2007/10/23(火) 20:57:51
クラス設計をきちんとすれば変数なんてトリビアルなものしかいらないからi,j,kで十分
901デフォルトの名無しさん:2007/10/24(水) 00:01:39
長大な変数名は使わないけど変数名には気を使うよ
902デフォルトの名無しさん:2007/10/24(水) 00:13:48
メンバ変数とかなら気を使うけど、ただの作業用の変数だと適当に
list_aとかlist_bとか、平気で使っちゃう。。。
903デフォルトの名無しさん:2007/10/24(水) 02:37:52
foo bar hoge orz 辺りは普通に使うよね?
904デフォルトの名無しさん:2007/10/24(水) 02:43:49
>>903
orzはないだろw
でも代入が面白そうだ >> orz = 〜
今度使ってみよっ
905デフォルトの名無しさん:2007/10/24(水) 02:55:33
それはなー、代入じゃなくて挿に(以下自粛
906デフォルトの名無しさん:2007/10/24(水) 03:46:02
orz=3
907デフォルトの名無しさん:2007/10/24(水) 09:59:37
Ruby認定試験対策問題 by NaCl
http://projects.netlab.jp/ruby-test/

> これら問題が全く的外れだったとしても責任は持てません。ご了承ください。

> 10月26日 18:30から松江オープンソースラボ(松江テルサ別館2階)で開かれる 第15回オープンソースサロンでは,
> これら模擬試験問題から以下の問題のうち,赤枠でピックアップしたものを解説します。
> 解答は10月26日までに公開する予定です。
908デフォルトの名無しさん:2007/10/24(水) 10:57:38
>>880
日本語でおk
909デフォルトの名無しさん:2007/10/24(水) 16:02:04
if(hoge)
 return true
end

のような式を抽象化したいのですが、関数にしても結局呼び出し元で返り値を
チェックしてreturnする必要があります。
Cのマクロのように、条件によってreturnするしないを一行にまとめる方法はないでしょうか?
910デフォルトの名無しさん:2007/10/24(水) 16:07:33
return true if hoge
911デフォルトの名無しさん:2007/10/24(水) 17:36:46
>>907
言語仕様がないんだから実行結果に関する問題が出せるわけがないwww
912デフォルトの名無しさん:2007/10/24(水) 18:13:34
>>907
2ちゃんねらの総力をあげて解答UPしようぜ!!!
913デフォルトの名無しさん:2007/10/24(水) 18:17:46
Rubyの勉強がてらにWebアプリを作りたいと考えてます。
WebサーバはApacheとlighttpdのどちらがいいでしょうか?
早い段階でRailsも試したい&無料レンタルサーバで動かしたいとも考えています。
Rubyの他、PHPも使います。(OSはFedora7)
外部のサーバはApacheが多いと思うので家でもApacheの方がいいのでしょうか?
あとサーバによってソースを修正する必要はないですよね?
914デフォルトの名無しさん:2007/10/24(水) 18:19:02
>>907
さっと見たけど、なんつーか・・・
下の問題で解が出てるとか試験になってないな
915デフォルトの名無しさん:2007/10/24(水) 18:39:48
>>907
「1.1.実行方法」って、こんなの Ruby の問題じゃないじゃん。
シェルの実装によっては選択肢に正解が無い可能性もある。(事実上無いとは思うけど)
916デフォルトの名無しさん:2007/10/24(水) 18:43:44
事実上なければ問題ない。
Rubyそのものがそういうものなんだし。
917デフォルトの名無しさん:2007/10/24(水) 18:53:11
>>913
無料レンタルサーバを前提に考えるなら、Apache一択だが
そもそもどのサーバでも大差ないとは思う。基本は同じだから

あとWEBrickという選択肢もある
918デフォルトの名無しさん:2007/10/24(水) 19:03:02
>>908
どこか日本語としておかしい?
919デフォルトの名無しさん:2007/10/24(水) 19:04:44
>>907
正直、バージョンの違いによる差も考えてなければプラットフォームの違いによる差も考えてないというあたりで役に立たない予想問題だった。


もっとも、実際の試験問題もこんなレベルなのかもしれん
920デフォルトの名無しさん:2007/10/24(水) 19:10:46
バージョンやプラットフォームの違いに関する知識なんて問うてどうする
オタク向けカルトクイズじゃねえんだぞ
いや1回目は似たようなもんかもしれんが
921デフォルトの名無しさん:2007/10/24(水) 20:06:17
>>920
バージョンやプラットフォームの違いに関する知識が問われてるんじゃなくて、バージョンやプラットフォームが違ったら結果が違うようなことを問われてるんだってば。
つまり正解が一つに決まらなかったり選択肢に正解がなかったりするということ
922デフォルトの名無しさん:2007/10/24(水) 20:57:23
叩くのは解答が出てからでも遅くないだろ
923デフォルトの名無しさん:2007/10/24(水) 23:29:25
rubyから帳票を印刷したいです。osはw2kです。
文字を印刷するだけでいいんだけですが、どうやれば
印刷できますか?
924デフォルトの名無しさん:2007/10/24(水) 23:41:09
system("notepad /p #{filepath}")

印刷用の外部プログラムを起動させるのが素直
925デフォルトの名無しさん:2007/10/24(水) 23:56:32
>>921
さすが実装が仕様なだけあるな
926デフォルトの名無しさん:2007/10/25(木) 00:33:10
通常は
if (hoge==10)
do_foo
end
のような処理をして、変数xがtrueのときだけ
if (hoge==10) && (age==20)
do_foo
end
と動作するようにしたい場合はどのように書けばいいのでしょうか?
927デフォルトの名無しさん:2007/10/25(木) 00:43:51
if x
 do_foo if (hoge==10) && (age==20)
else
 do_foo if (hoge==10)
end

そのまんまだけどw
でもどちらもdo_fooだから結果は同じ?
928デフォルトの名無しさん:2007/10/25(木) 00:52:01
t = (hoge == 10)
t &= (age == 20) if x
do_foo if t
とか

do_foo if(x ? (hoge==10) && (age==20) : (hoge == 10))
とか?

一次変数増えるけどDRYに従って個人的な好みは上。
929デフォルトの名無しさん:2007/10/25(木) 01:14:44
>>918
いや、違くて、変数名は日本語でもおk

#!/usr/local/bin/ruby -Ku
arr = [{"title"=>"foo", "category"=>1}, {"title"=>"bar", "category"=>2}]
カテゴリ番号配列 = [1, 2]
カテゴリ番号配列.each do |category|
カテゴリ番号に一致する書籍のハッシュ = arr.find_all{|e| e['category'] == category}
p カテゴリ番号に一致する書籍のハッシュ
end
930926:2007/10/25(木) 01:15:18
参考になります。ありがとうございました。
実際にはdo_fooは10行ほどのコードなんですが
これらをbegin,endで囲んでifを後置きするようにすればいいんでしょうか?
931デフォルトの名無しさん:2007/10/25(木) 01:35:30
ちょ。begin って!

Algol 系の begin と Ruby の begin は超別物
932デフォルトの名無しさん:2007/10/25(木) 01:40:18
テキストファイルなどを後ろから1行ずつ読みたいんですけど、
IO.readlines("hoge.txt").reverse.each { |t|
p t
}
こんなのより良い書き方ってありますか?
933デフォルトの名無しさん:2007/10/25(木) 02:42:50
後ろから1行ずつ「処理」したいんならそれでいいと思う

どうしても後ろから読みたい、ってことじゃない、よね?
934デフォルトの名無しさん:2007/10/25(木) 02:54:16
>>880は説明のために「日本語のような変数」で書いてるだけだろ。擬似コードみたいな。
いちいち「xxxは○○な変数で…」とか説明するの面倒じゃん。

いや、もしかしたら日本語変数な人かも知れんけど。

>>926
「xがtrueでなくhogeが10のとき」か「xがtrueでhogeが10でageが20のとき」に真
これを踏まえて自分がわかりやすいように素直に記述
935デフォルトの名無しさん:2007/10/25(木) 02:57:55
>>932
IO.readlines("hoge.txt").reverse_each{ |t|
p t
}
936デフォルトの名無しさん:2007/10/25(木) 09:15:17
>>934
日本語でおk
937デフォルトの名無しさん:2007/10/25(木) 10:41:41
>>932
File.open('tail -1 -f hoge.txt |').each { |t|
p t
}
938デフォルトの名無しさん:2007/10/25(木) 11:23:19
>>937
質問の意味を取り違えてない?
939デフォルトの名無しさん:2007/10/25(木) 12:07:39
あー
940デフォルトの名無しさん:2007/10/25(木) 13:56:14
net/httpを使ってファイルをダウンロードするには
どのように記述すればよいのでしょうか?

http://www.google.co.jp/intl/ja_jp/images/logo.gif
を例に教えていただけるとありがたいです。
941デフォルトの名無しさん:2007/10/25(木) 14:11:00
>>940
昨今見ない丸投げっぷりに非常に感動した

http://www.ruby-lang.org/ja/man/?cmd=view;name=net%2Fhttp
の「ウェブサーバからドキュメントを得る (GET)」がファイルの取得でファイルの中身がresponse.bodyなので
それを
http://www.ruby-lang.org/ja/man/?cmd=view;name=%C1%C8%A4%DF%B9%FE%A4%DF%B4%D8%BF%F4
の組み込み関数っぽいメソッドのopenを使って適当な名前で書き込む

ってこのマニュアル小難しいなオイ
942デフォルトの名無しさん:2007/10/25(木) 14:17:21
>>940
やっつけ

require 'open-uri'

open("http://www.google.co.jp/intl/ja_jp/images/logo.gif") do |dl|
 File.open('logo.gif', 'wb') do |f|
  f.binmode
  f.print dl.read
 end
end
943940:2007/10/25(木) 14:18:24
>>941
open('logo.gif', 'w+b')
できました!ありがとうございます。
944940:2007/10/25(木) 14:18:59
>>942
親切心、ありがとうございます!
945デフォルトの名無しさん:2007/10/25(木) 14:25:39
組み合わせ技の例とか無いんだよね、マニュアル

# 教科書的
require 'net/http'
Net::HTTP.version_1_2
Net::HTTP.start('www.google.co.jp', 80) {|http|
response = http.get('/intl/ja_jp/images/logo.gif')
open('logo.gif','w'){ f.print response.body}
}

# 上記はあまりに面倒なので uri.rbを使う
# open(File.basename(uri.path),'w'){|f| Net::HTTP.get_response(uri)} で一発だが忘れ去られてるので使わない
require 'net/http'
Net::HTTP.version_1_2
require 'uri'
uri=URI.parse('http://www.google.co.jp/intl/ja_jp/images/logo.gif')
Net::HTTP.start(ur.path, uri.port) {|http|
open(File.basename(uri.path),'w'){ f.print http.get(uri.path).body}
}

# ここまで短くしたらopen-uriでいいんじゃね? みたいな
946デフォルトの名無しさん:2007/10/25(木) 14:35:50
単にファイルをダウンロードするだけなら、net/httpよりも
open-uri で

require 'open-uri'

uri = URI.parse('http://www.google.co.jp/intl/ja_jp/images/logo.gif')
gif = uri.read()
File.open('logo.gif', 'wb'){|f|
f.write(gif)
}
947デフォルトの名無しさん:2007/10/25(木) 14:47:04
>>945
Net::HTTP.get_response を知ってるなら net/http のソースの先頭見てみるといい
require 'uri' って書いてあるから
net/http と uri を両方require してしまう人は意外と多い
ttp://jp.rubyist.net/magazine/?0015-BundledLibraries
るびまでもやっちゃってるから仕方ないけどね
ダブって require する実害は無いといっていいからダブってもいいんだけど

irb> require 'net/http'
true
irb> require 'uri'
false
948デフォルトの名無しさん:2007/10/25(木) 15:47:33
949デフォルトの名無しさん:2007/10/25(木) 16:12:15
質問です。ruby初心者です。

『WWW::Mechanize』を使って、ページのsubimtボタンを押したいのですが、submitボタンが複数ある場合、どう記述してよいのかわかりません。
どなたかご存知でしょうか?

agent = WWW::Mechanize.new
agent.user_agent_alias = 'Windows IE 6'
page = agent.get('http://〜〜')
form = page.forms[0]
page2 = agent.submit(form) # ←これで一応押せるのですが、submitが沢山あるときに

agent.submit(ココにどう記述していいかわかりません。)  #←submitメソッドの引数になにを入れていいのかわかりません。

どなたか、ご存知の方いますでしょうか?
950デフォルトの名無しさん:2007/10/25(木) 16:14:46
ruby -e 'require "net/http"; Net::HTTP.get_print("www.google.co.jp", "/intl/ja_jp/images/logo.gif")' > logo.gif
951デフォルトの名無しさん:2007/10/25(木) 16:19:32
ボタンが複数あろうと、普通押すのは1つじゃないか?
たぶんaction属性書き換えたらいい気がする
952デフォルトの名無しさん:2007/10/25(木) 16:21:36
>>949
submit(form, button=nil)
953デフォルトの名無しさん:2007/10/25(木) 16:23:22
954デフォルトの名無しさん:2007/10/25(木) 16:26:56
>>950
次スレよろしう
955デフォルトの名無しさん:2007/10/25(木) 16:31:23
次のようなコードを書いたら
syntax error, unexpected kIF_MOD, expecting kTHEN or ':' or '\n' or ';'
とエラーが出てしまったんですが、どうしたら動くようになるのでしょうか?

if 1
 puts 10 if 1
elsif
 puts 2 if 1
end
956949:2007/10/25(木) 16:34:22
>>951
はい、そうなのですが、どのsubmitボタンか…というのを限定する方法が
submit(???)で出来るらしいのですが、なにを入れたらよいのか、わからないのです。

>>952
ご返答ありがとうございます。
submit(form, button=nil)
の2つ目の引数の button=nil になにが入るのかわかりますでしょうか?

submit の nameなのか value なのか どちらも違うのか…

なんども質問すみません。
957デフォルトの名無しさん:2007/10/25(木) 16:36:17
>>955
elsif じゃなくて else
958949:2007/10/25(木) 16:37:17
>>953
返答ありがとうございます。
サイトをみたのですが、 subimt()のところがどうなっているのかよくわからないのです
959デフォルトの名無しさん:2007/10/25(木) 16:52:28

Ruby 初心者スレッド Part 15
http://pc11.2ch.net/test/read.cgi/tech/1193298175/

960デフォルトの名無しさん:2007/10/25(木) 16:54:10
>>956

button が入る

page = agent.submit(form, form.buttons.first)

2つ目以降のを押したいときは
form.buttons[1]
とかじゃなかったかな

http://mechanize.rubyforge.org/files/EXAMPLES_txt.html
961949:2007/10/25(木) 16:58:26
>>960
おおおっ!!!

ありがとうございます!!
3日悩んでたのですが、解決しませんでした!!

感謝です!!
962デフォルトの名無しさん:2007/10/25(木) 17:07:16
リファレンスも見ないでどうやって悩んでたんだ?
963デフォルトの名無しさん:2007/10/25(木) 19:48:20
むしろわざわざマニュアルわかりにくいWWW::Mechanizeでなければならん理由がわからん
964デフォルトの名無しさん:2007/10/25(木) 21:31:41
じゃあこの手のことやるのに何がお勧めなのよ。
965デフォルトの名無しさん:2007/10/25(木) 21:54:23
class Hoge
def foo
....

上のようにクラス定義の中でdefを使った場合、メソッドはHogeオブジェクトの中に
定義されるのに

class Hoge
 def foo
  def bar
   ...
  end
 end
end

obj = Hoge.new
obj.foo
とやってもnewで生成されたオブジェクトの中ではなく、Hogeオブジェクトの中に
メソッドが定義されてしまうのは何故なんでしょうか?
966デフォルトの名無しさん:2007/10/26(金) 00:12:46
>>965
記述方法が違うから?スコープの問題?正直よくわかんね
でもインスタンスにメソッドを定義する時(特異メソッド)はこう書く
class Hoge
 def foo
  def self.bar
   puts 'bar'
  end
 end
end
967デフォルトの名無しさん:2007/10/26(金) 10:10:01
Hogeクラス内に含まれる「def bar」は、
そのコードを実行したときにHogeクラスにメソッドbarを追加する、
って文法だからじゃね?
「def foo」は最初に実行されてる。

俺流解釈だから、間違えてるかも。
誰かフォローよろ

・サンプル ↓だけのスクリプトを実行するとだと1が表示される。
class Hoge
 p 1
 def foo
  p 2
  def bar
   p 3
  end
 end
end
968デフォルトの名無しさん:2007/10/26(金) 10:28:30
マニュアル読もうぜ。全部書いてある。

>>967
その通り。Hogeへの「その記法」のメソッド追加定義動作が遅延されるだけ。
特異メソッド定義したいなら特異メソッドのように定義すればいい。

class Hoge
p 1
def foo
p 2
def bar
p 3
end
end
end

h=Hoge.new
puts '-----------------'
h.bar rescue puts 'bar is undefined'
puts '-----------------'
h.foo
puts '-----------------'
h.bar


1
-----------------
bar is undefined
-----------------
2
-----------------
3
969デフォルトの名無しさん:2007/10/26(金) 18:53:54
activerubyインスコしてコマンドプロンプトで  c:\Documents and setting\user>ruby -v
と打っても ’ruby’は内部コマンドまたは外部コマンド、操作可能なプログラムまたは
バッチファイルとして認識されていません。
とでて始めることができません

ソースをを窓にぶち込むと動いてくれたんですが
この状態だとライブラリがうまく使えないみたいなので困っています
970デフォルトの名無しさん:2007/10/26(金) 19:01:20
>>969
>ソースをを窓にぶち込むと動いてくれたんですが
意味わからん。

その「コマンドプロンプト」をどうやって開いたのか知らんが、
スタートメニューから辿ってActiveScriptRubyグループの中に
ある奴を使ってくれ。
971デフォルトの名無しさん:2007/10/26(金) 19:15:06
>>970
ありがとうございます ruby consoleから入力したらライブラリ読み込んでくれました。
アクセサリのコマンドプロンプト使って
テキストエディタで作った拡張子 rb
ファイルドロップして動かしていました。
972デフォルトの名無しさん:2007/10/26(金) 19:16:49
PATHを設定しろ
ただし、「C:\ruby\bin」の部分は自分でASRをインスコしたディレクトリに置き換えて
http://www.ruby-lang.org/ja/install.cgi?cmd=view;name=Windows%A4%C7%A4%CEPATH%A4%CE%C4%CC%A4%B7%CA%FD
973969:2007/10/26(金) 19:39:07
>>972
ありがとうございます
今度はbmp取り込みエラーが出て困ってましたが
これして本に書いてるとおりライブラリ読み込んで動作するようになりました。
974デフォルトの名無しさん:2007/10/27(土) 00:20:32
rubyの前に日本語を勉強したほうがいいと思った
975デフォルトの名無しさん:2007/10/27(土) 11:15:26
すみません、ちょっと初心者の質問させてください。

rubyを使ってRailsで動いているアプリのログインを行い、
ページ情報を取得しようと思っています。

ソースを見ると、username,passwordをPostしているページがあるのですが、
それがbasic認証かどうか確認する方法がありますでしょうか。

以下のようにやっても、not foundになってしまいます。

http://www.test.com/app/login
という画面があり、そこにフィールド名,username,passwordがあります。

require 'net/http'

Net::HTTP.version_1_2

req = Net::HTTP::Get.new("/login")
req.basic_auth 'user','password'

Net::HTTP.start('www.test.com', 80) {|http|
response = http.request(req)
puts response.body
}
976デフォルトの名無しさん:2007/10/27(土) 11:38:21
ん?
Basic認証は半自動で行われるいわゆるアクセス許可であって、アプリケーションのログインに当たるものじゃないよ?
そのディレクトリにアクセスできるかどうかを許可してるだけ

basic_auth を指定しない(あるいは間違ったユーザー名とパスワードをの)アクセスで
401 Authorization Required が返ってくればBasic認証領域だってことだけど、それ以外で認識する方法はないと思う
(認証が成功したときに返ってくるHTTPヘッダには認証のことについては普通は何も書いてないはず)
977デフォルトの名無しさん:2007/10/27(土) 11:53:26
>>976
ありがとうございます。
Basic認証とかその前にHTTPアクセスについて勉強が足りないようでした。

もう少し勉強してから出直してきます。
978デフォルトの名無しさん:2007/10/27(土) 13:00:54
Hashをpで表示したときの結果をそのままStringにする方法はありますか
例えばa ={ 'k1' => 'v1', 'k2' => 'v2'}のとき
p a -->{ 'k1' => 'v1', 'k2' => 'v2'}
puts a -->k1v1k2v2
となりますが,
puts a.hoge -->{ 'k1' => 'v1', 'k2' => 'v2'}
みたいな感じのメソッドがあれば。
一つ一つイテレータで作り出すしかないのでしょうか?
979デフォルトの名無しさん:2007/10/27(土) 13:18:52
inspect
980デフォルトの名無しさん:2007/10/27(土) 13:19:23
p x がやってるのは $stdout.puts x.inspect と同じ。

981デフォルトの名無しさん:2007/10/27(土) 19:15:18
class Foo
include Math
def test0 ; p sin(1); end
def Foo.test1; p sin(1) ; end
def Foo.test2; p Math.sin(1); end
end

Foo.new.test0
Foo.test1
Foo.test2

test1でエラーを出なくするにはどうしたらいいんでしょうか?
982デフォルトの名無しさん:2007/10/27(土) 19:45:26
extend 'Math'

影響範囲は大きいので数学っぽいメソッドを自前で定義するときは注意
983デフォルトの名無しさん:2007/10/27(土) 19:48:22
越後「クリアリングが甘いぞハルミ!」
984981:2007/10/27(土) 20:11:55
>>982
いけました。ありがとうございます。

名前がぶつかる問題は今のところはなさそうです。
985デフォルトの名無しさん:2007/10/27(土) 20:29:55
スクリプト
986デフォルトの名無しさん:2007/10/28(日) 01:05:25
DMDスレの誤爆か
987デフォルトの名無しさん:2007/10/28(日) 01:26:24
ハルミスレです><
988978:2007/10/28(日) 10:06:28
>>979
>>980
ありがとうでした。
980の説明は解りやすくてよかったです。
989デフォルトの名無しさん:2007/10/28(日) 19:49:49
>>980
細かいこというと直接write使ってるっぽいよ。
IO#putsとかIO#printとか再定義してもそのままだったし。
990デフォルトの名無しさん:2007/10/28(日) 20:27:46
というかそれこそマニュアル嫁って感じだな
IOにある表示のメソッドはwriteを直接呼んでることになってる
printやputsを流用してるメソッドは無い

著名なモジュールや自作のクラスでもwriteを使うってのは気の遣い過ぎだが

ただ、ファイルに書き出すときはio.printだとピンと来ないのでio.writeと書いてる俺
991デフォルトの名無しさん:2007/10/28(日) 22:37:23
>>990
Rubyにマニュアルなんてあったかなwww
992デフォルトの名無しさん:2007/10/28(日) 22:40:18
>>991
楽しいな
993デフォルトの名無しさん:2007/10/28(日) 23:27:33
Ruby 初心者スレッド Part 15
http://pc11.2ch.net/test/read.cgi/tech/1193298175/
994デフォルトの名無しさん:2007/10/30(火) 00:06:35
ume?
995デフォルトの名無しさん:2007/10/31(水) 17:38:59
ume
996デフォルトの名無しさん:2007/10/31(水) 18:51:54
アルファベットの出現頻度として
aが何個
bが何個
cが何個のように
a〜zの単独出現個数を知りたいのですが、うまくいきません。

このプログラムだったらa-zのすべての個数が合計として結果に表示されてしまうのです。
何かうまい方法ありませんかね!?

f=open('g:\test.txt')
t=f.read
u=t.split(//); w=t.split
count=0
for i in 0..u.size-1
if u[i]=~/[a-z]/i then count+=1 end
end
puts count
count=0
for i in 0..w.size-1
if w[i][0,1]=~/[a-z]/i then count+=1 end
end
puts count
そろそろスレ消えるんで申し訳ないすけどたのんます!
997デフォルトの名無しさん:2007/10/31(水) 19:05:15
hash = {}
str.split(//).each do |c|
if hash[c].nil?
hash[c] = 1
else
hash[c] += 1
end
end
p hash
998デフォルトの名無しさん:2007/10/31(水) 19:08:19
file=File.open('g:\test.txt').read
h=Hash.new
file.split(//e).each do |s|
h[s] = 0 unless h.has_key?(s)
h[s] = h[s] + 1
end
h.sort.each do |a|
puts "#{a[0]}は#{a[1]}個です"
end

ってたいして変わらんな
999デフォルトの名無しさん:2007/10/31(水) 19:10:39
あー、Windowsならsplit(//s)か。
とにかく、分割したアルファベット自体をキーとするハッシュに登録して数えるのが真っ当かと。
1000デフォルトの名無しさん:2007/10/31(水) 19:13:51
ありがとうございます!!!
超ありがたいです!!
ほんますいませんしたぁぁあ!!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。