1 :
デフォルトの名無しさん :
2007/08/25(土) 13:05:43 プログラミング言語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あんま関係ない気がしますが、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は避けきれません。うまい方法ありませんか?
Windowsなら化けない
wxRubyを使ってたんですが、ListCtrlにset_background_colourで背景色 を設定しようとしたら `set_background_colour': stack level too deep (SystemStackError) と出て落ちてしまいます。 ほかのコントロールは普通に背景色設定できるんですが、 ListCtrlは何か違うんでしょうか?
ちょっとした、スレッドと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] です。 よろしくお願いします。
新スレなのに質問ばっかで回答Neeeeeeeeeeeeeeeeee
>>12 そもそもs.getsで何も受け取ってないとか
>>12 > Thread.start(accept.accept) do |s
最後にパイプが抜けてるのはコピペミス?
open-uriで追加ヘッダフィールドを渡す場合、マニュアルによれば open(uri, 'Cookie'=>cookies,'Connection'=>'keep-alive','Keep-Alive'=>'30') などいちいち直に書かなくてはなりません。なんだか面倒です。 「ハッシュに格納しておいたヘッダフィールドをちょっと加工して渡す」というような便利な方法はありませんか?
ハッシュそのまま uri のあとに渡してもダメ?
OpenURI.open_uriを読む限りでは…よくわからんな
>>12 別のアプリから何か送ってやらないと何も表示されないだろ
そのスクリプトを動かしておいて、別のコンソールから
ruby -rsocket -e "s=TCPSocket.open('localhost',8080);s.write('foobar');s.close"
とかやってみれ
>>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です
ところで、引数のハッシュリテラルの{}が省略可能ってマニュアルのどこかに記述してあるのかな?
私はわりと長い間知らなかったんだけど…
っていうか、むしろ、なんで省略なんかできるようにしたのかさっぱりわからん これで誰が喜ぶんだよ
キーワード引数のエミュレートだから ピカチュウ本(初版)には書いてあったよ このあたりはるりまでいくらか改善されるのだろうか・・・
プログラミングRubyの第二版には書かれてた。わりと初めの方だったと思う。
>>22 メソッド呼び出し時の引数のHashの { } が省略できると、( ) も省略できるので個人的には多用している。
( ) なしで { } を書くとブロックとみなされちゃうのよねん。
なるほどというか、そのためなのかな
メソッド呼び出しの () は常につけようぜ
()は付けるなって規約に書いてたけど・・・
printとかputs以外は()付けてるなあ
引数がある場合のみ絶対つける いや、foo hoge huga と並んでたとして、 これがメソッドfooに変数hogeとメソッド(の返り値)hugaを渡してるもんだってわかりにくいだろ いくらRubyがうまく解釈してくれるから動くからって言ったって、書いてる人間がわかりにくかったら意味ねーよ、と思ってる 常につけないメリットってなんじゃらほい
漏れはプロシジャ的に呼ぶ時はつけなかったりする
>>30 カンマカンマ
>>9 '-Ewxm0 -Lu --no-best-fit-chars' でどうでっしゃろ?
arr = [] while gets arr << $_ end を一発で書く方法ないですか?
readlines
関数的メソッドgetsとwhileのタッグを広めた奴の罪は根深いな
普及 (Perl からの移行) を促進するには仕方なかったのだろうか?
引数が長過ぎて途中で改行する時だけ()つける。 そうしないのruby-modeのインデントが変なんですもの
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
そのループの例、readlinesいるか…?
IOクラスのインスタンスが生成されてるはずだからARGF.eachでそのまま動くはず というかARGF.readlinesのreadlinesもクラスメソッドではなくインスタンスメソッドなんじゃね?
>>38 全然違うよ
while line = gets; p line; end
この場合の gets は $stdin.gets の略。ARGF は
% hoge.rb foo.txt bar.txt
みたいにしたときに foo.txt, bar.txt の内容が入ってる
仮想的なファイルオブジェクト(オープン済み)
42 :
41 :2007/08/28(火) 16:07:33
すまん大嘘書いた(;´д`) Ruby マニュアルより
> ARGF
> スクリプトに指定した引数 (ARGV を参照) をファイル名とみなして、
> それらのファイルを連結した 1 つの仮想ファイルを表すオブジェクトです。
> ARGV が空なら標準入力を対象とします。
細かいことはさておき
>>38 のでよかったんだな。申し訳ない
readlines みたいに (ファイルがでかいと) メモリを湯水のように使いそうな メソッドを使うのはいかにも富豪プログラミングっぽくってなんかイヤだなあ、 と思う俺は我ながらかなりしみったれてるな、と感じる今日このごろ。
本当にちょっとずつ読むようなメモリに優しいメソッドってそもそもRubyに少ないような… 最近は瞬間的なメモリ使用量増大はもうあきらめて、 なるべく不要になった直後にarr.clearとかstr=nilとかするようにしてる これはこれでなんか空しい
1.9 で readlines も Enumerator を返すようには・・・ならんか。 ファイルを一揆読みしたいだけのときに勝手に遅延されたらかなわんしな。
メソッド呼び出しにカッコ付けるか付けないかは 俺の場合はブロック以外の引数を見て 引数なしならいつもカッコなし 引数が複数行に渡るならいつもカッコあり( ) x = 引数がありメソッドの戻り値を得たいなら(カッコあり) カッコ(あり) if 引数があり後に修飾子が付く 引数があっても 後に修飾子が付かず,戻り値も得ないなら,カッコなし
ARGFがIOオブジェクトだって言われてて、 ARGF.eachとかもよく使うんだが、 ふと気になってp ARGF.classしたらObjectだったような 記憶がある
IOオブジェクトのメソッドが使えるってだけで、厳密にはIOインスタンスを返してるのではないはず 注意深い人の説明は「ARGFはIOオブジェクトのメソッドが使えますよ」というような文言になってる
is_a? よりrespond_to? で考えよう というと広げすぎor的外れかな
相談させてください。 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
>51 細かく言うと「コード2」は派生でなく委譲やね(書いてあるとおりだが) もちろん禁じ手でも何でもない。 自分の意図した動きをして、自分の意図がより率直に書けていると思う方を選べばよろし。 ただし、コード2では(書いてあるとおり) DerivedはBaseのサブクラスではないので注意。
>52 どもです。 すみません。自分の頭の中を言わずにすっとばしてましたね。 委譲であることは理解しています。 またご指摘頂いたとおりサブクラスではない、 すなわち kind_of が(派生ならば true となるのに) false になるのも分かっています。 心配なのは次の点です。 SimpleDelegator は method_missing を利用している(…たぶんそう)ので、 委譲先のメソッドを多用する場合、速度面でどのくらい不利になるのか? 上記の該当する想定として ・あるクラスを少しだけ機能追加、機能拡張して使いたい。 ・けれども、大抵は拡張前の機能(メソッド)が呼ばれる。 を考えています。 あぁそうか「method_missing ってコストが高いですか?」って 聞けばよかった気がしてきました。すみません。 というわけで method_missing は高くつくものでしょうか?
>53 ソース覗いたけど、method_missingは使ってない。 始めにmethodsでオブジェクトのメソッドを洗い出して、 同名のメソッドを委譲先にsendする特異メソッドを自分にevalしてる。 だからコストが高いのはnewの時だと思う。 sendはリフレクションの中では早いほうだったと思う。
高くつきます。 問題は、高いかどうかではなく、それが許容範囲かどうかです。スピードが必要であればお勧めしません。 また他にボトルネックがある場合(たとえばDBへの接続とかがボトルネックになっている場合)は、method_missing をなくしたところでアプリケーションは速くなりません。
method_missingが高くつくかどうかなんて、 中の処理しだいだと思うのは漏れだけか…?
>54 ソースまで見て頂いてしまって恐縮です。 こちらも今、見てみました。確かに new の時に色々やってますね。 今は目的としてインスタンス毎に委譲先を変えたい訳でもなく、 ただ継承と同じことをしたいだけなので。 ただし、 >51 のプライベートインスタンス変数の件を解決した形で。 >55 むむ…そうですか。 method_missing の呼び出しに掛かるコストは (通常のメソッド呼び出しと)同等程度かと思っていました。 通常のメソッド呼ぶときにもインスタンス内にある メソッド名のスロット(でいいのかな?)を探して、 あったら呼ぶと思っていたので、 どちらにしてもメソッド名の探索をする時点で似たような ものかな〜と。 う〜ん…高いのかぁ。どの位違うか測ってみようかな。 >56 すみません。私の書き方が悪かったですよね。 何について高いか知りたかったか、というと 「method_missing の処理が始まって、終わるまで」ではなく、 「method_missing の処理が始まるまで」なのです。 delegate.rb を眺めていたら、 DelegateClass というのもありました。 DelegateClass は(module_eval しているトコの) initialize も短いし、 継承の代わりに使うなら、DelegateClass がいいかもですね。
質問です。スレの趣旨から少し外れてしまうかもしれませんが。
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/ アンドゥ情報を削除するメソッドがないか探してみたのですが、うまく見つか
りません。
irbで、たとえば何か文字列を返すようなメソッド、 irb> file = File.read('1MB.txt') とかすると、読み込んだ1メガバイト分のファイル内容がずらーっともう延々と画面上を流れていくんですが、 とってもウザいので何とかしたいです。 ・ 設定で何とかなる ・ 書くときにこういうメソッドを使うと表示はされなくなる というアドバイスをお願いします。今もまだえんえん流れてます。勘弁して欲しいです。
>今もまだえんえん流れてます ワロタw
file = File.read(file) and 1 って付けてみるとか
(file = File.read('1MB.txt')).type とかやってみるとか
カンマの復文で消しゃいいんじゃんね?とおもったら a = 1, b = 2, c = 3 ってやると期待したとおりにならないんだね。
file = File.read('1MB.txt'); nil まぁ普通は ;nil だな。 mechanize とか使ってるときもコレは必須。 というかmezhanizeとirbの相性の悪さは異常
>>59 $ irb --noecho
で起動するか、
~/.irbrc に
IRB.conf[:ECHO] = false
を追記する。
使い捨てスクリプト言語のくせにgotoねーのかYO!・・・orz
gotoは実装するの面倒だったという話がある どうしても何らかの理由でジャンプしたいなら catchとthrow か rescueとraise あるいは ループとbreak/next/retry か メソッド定義とreturn の組み合わせで跳べ Rubyでも複雑なgoto文プログラムに負けない複雑なプログラムを書くことは可能だ
>>67 gotoなんて長らく使っていなければ、gotoが欲しいなんて全く思わなくなるから、
gotoのないプログラミングに早く慣れたほうがいい
>>63 ~/.irbrcでreturn_formatを指定。
IRB.conf[:PROMPT][:DEFAULT][:RETURN] = "%.100s\n"
100byteまでに切り詰められる。
71 :
59 :2007/08/30(木) 15:13:23
昨日のirbが嫌いになりそうだった者です返答感謝です
何かあったときのために
>>61 と
>>65 を覚えておくことにします
設定は
>>70 がよいとこ取りでいい感じなので1万バイトに制限してみました
1万バイトまではOKなのか。 つっても100x50なら二画面だけだな。
数えてみたら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が左辺なの? わかんね
3<=>5は「Integerクラスに属する3のインスタンスメソッド<=>に引数5を渡してる」って読むんだぜ Stringだとわかりやすい irb> 'a'.<=>('b') -1 ということで、selfが大きければ正だ それ以外の何物でもない 右辺とか左辺とかそーゆーわかりにくい概念無し
>>61 自分は場合によっては;nilを付けてる。
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
一般論として、「HTMLから正規表現reで○○な部分を抜き出して配列に格納」は arr = html.scan(re).flatten とか html.scan(re){ arr.push("url: #{$1}") } とか書く やってみ
81 :
デフォルトの名無しさん :2007/08/31(金) 00:28:28
>>76 あっざーす
レシピの本に右辺左辺って説明があってもやもやしてました
82 :
79 :2007/08/31(金) 00:29:56
>>80 あああああ、
できました!!1!
html.scan(re){ ←
arr.push("url: #{$1}")
} ←
の括弧がなかったのが原因でした。
しかしなぜ必要なのかいまいち分からないまま・・・
勉強してきます。
これで今夜はぐっすり寝られそうです。
ありがとうございました!
Array#shuffleキボソス
>>83 arr.sort{|x, y| rand(3) - 1 }
>>76 > selfが大きければ正
(selfさえわかってれば)めちゃくちゃわかりやすい説明ですな
Array#swapだかexchangeの要素の交換ってないの?
具体的にどんな動作なのか言ってくれ ○○言語の××、でもいい
89 :
デフォルトの名無しさん :2007/08/31(金) 10:37:08
rubyの言語仕様ってどこにあんの? どっかにあるらしいのですが・・・
ガンダーラといい勝負だな・・・
その〜国の名は島根、どこかにあるユートピア。
鳥取とかもどこかにある感じだよな
取烏の帝都営団高速交通に乗って行けるところにあるらしい
>>79 HTMLをスキャンして配列にデータ格納、ってのはあんま initialize に詰め込む処理じゃねーな
作るのに慣れてきたらメソッドに分けることを考えるといいかも
標準出力に表示されている文字列を変数に入れるにはどうすればいいのでしょうか? キーボードから文字を拾うのはあちこちに説明があるのですが、 コンソール画面に表示されている文字を取り込む方法が探しきれません 以前Cの質問スレできいてみたのですが、スルーされてしまったのでこちらで聞いてみました マルチではないつもりですが気に障ったらスミマセン
Cスレで聞いたものをなんでこのRubyスレで聞けるん?? 一般論としては既に表示してしまった文字を取り込む方法は無い 普通の表示とは違う表示領域自体を専用に作ってそこに表示しておくとかそういう芸が必要
97 :
95 :2007/08/31(金) 23:57:11
>>96 自分にとっては「文字列を取得する」という目的が大事であって
「Cでやる」とか「Rubyでやる」といった手段は二の次だったので
そういった節操の無さがRubistの気に障ったらごめんなさい
そうしますと、shellでバックスペースを押したときに左側の文字が消えるというのは
ものすごく低レベルなところで実装されているということのでしょうか?
あれは制御文字\bを表示してるだけだろ irb> puts "ABCD\bE" ABCE
99 :
95 :2007/09/01(土) 00:14:45
そうですよね。つまり「一度画面に出た文字列を操作した」ということなわけで だからそういった動きを自分の小さなプログラムでやるのは、高級言語ではやはり無理なのですね… shellがバックスペースで画面を操作できるのはバッファを管理しているから? Cursesとかでも触れるのかなと思ったのですが 変な質問に付き合ってくださってありがとうございます
>>99 > shellがバックスペースで画面を操作できるのはバッファを管理しているから?
バッファを管理してるのはターミナルエミュレータ。
何をしたいのかが全然説明できてない気がするな 15 年前の「パソコン」だったらともかく、現代の環境で、アプリケーションが 「キーボード」を読むのはそれなりに難しいように思うわけだが
深い話したいのか浅い話したいのかよくわからんね ターミナルが表示している文字を取り込むのは面倒だが、 プログラムの中でシェルを起動して目的のプログラムを動かしてその出力を奪うことなら普通にできる 他のプログラムの出力をパイプで最初に流し込むということもできるだろう
103 :
デフォルトの名無しさん :2007/09/01(土) 15:51:10
蛆久氏ね
すいません。.irbrcはWindowsの場合どちらにおけばよいでしょうか。 %HOME%に.irbrcをおいてみたのですが読まれないようです。 Windows XP、ActiveScriptRuby 1.8.5
ruby -e 'puts ENV["HOME"]' これで表示されるフォルダに置け
.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
蛆久イラネーヨ
>>105 なるほど!できました。ありがとうございます。
>>106 ここを押したけど続きが読めないんだけど。
ruby -e 'puts readlines.reverse' と似たような動作のUNIXのコマンドってありますか?
>>110 tac(1)
俺のFedoraCoreではcoreutilsで入ってる
tacだな わりと昔からあるから、Linuxなら使えるはず ちなみにFreeBSDには標準では入ってない
ありがとう。Cygwinには入ってるみたいだ。 しかしUNIXのコマンド名探しって推論機能が働いたためしがないな・・・w
もしかして、catの逆だからtacって名前なの?
それ以外に何があるというのか
Todai Automatic Computer
たたたtacん!オルフェノクだよ!
catの機能強化版でdogなんてのもあったな
>117 洗濯屋乙、てかえらい懐かしいネタを。
tacがあるのにdaehがないのはおかしい
caseの終了がesacでないのもおかしい
>>119 洗濯屋と言われるとケンちゃんしか思いつかない
大昔から使ってるHTML収集&生成スクリプトを即っとRSS出力対応にしようとしたら 時間をDateで管理していたらしくTime.httpdateが使えないのでがっかり これ、なんでTimeじゃなくDateを使ってたんだっけ…?
125 :
デフォルトの名無しさん :2007/09/03(月) 16:36:17
みなさん、CTCは好きですか?
初心者スレで聞くこっちゃないねえ 本スレでいじられてきたら
委託先がどこがやっても本質的な違いはないというかツッコミどころはそこじゃないんじゃねーのみたいなー
つしまね
129 :
デフォルトの名無しさん :2007/09/03(月) 19:49:04
CGIで、GETとPOSTで受け付けたデータを区別したいのですが 調べたらGETもPOSTも区別なく受け取れる…ってことぐらいしか 分かりませんでした。 どうすればいいんでしょうか? POSTのみ受け付けたいって処理をやりたいのです。
>>129 CGI#request_method をチェック。
ファイルの最終行から20行程読み込むという作業をおこないたいのですが ここの方ならどのように書きますか? ぜひ、スマートな方法をお願いします。
tail -n 20
>>132 一番のオススメは >133 w
でも、Rubyでやりたいって言うなら
IO.readlines(path).last(20)
が簡単だし解りやすい
けど、やたらバカでかいファイルを読ませたいなら
FileTest.size() 等を元にして後ろから指定バイト読ませたりとか
色々と工夫した方が良いかも知れないな
135 :
132 :2007/09/04(火) 10:57:56
>>133 >>134 レスありがとうございます。
Linuxコマンドでしょうか、、?
しょぼいファイルを扱うのでlast()メソッドで十二分に満足です。
ありがとうございました!
rubyにqueue, sized queueがないのはおかしい
sized queue はともかくとして、 queue は Array の機能でどこらへんが不足なの?
要素の追加と削除がO(1)で出来ないところ
Array#shiftもArray#pushもO(1)なようだが
というか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 標準添付の 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 ヘルプを表示
optparseは中二病のの臭いというか、「Rubyってこんなこともできるんだぜスゲー」の時期に作ったモジュールって感じがする もうちょっとみんなで落ち着いて考えればもうちょっとは「Rubyらしい」動作になったと思うんだけども
じゃあ中年の加齢臭漂うやつを一つお願いします
しつもん。 自作クラスやメソッドの使用方法ってみんなどうやって書いてる? rd形式とかでメソッド定義の先頭に自分でわかる程度につらつら書くとか? サポートするエディタのモードとかあったりしないのかな。
ソースがドキュメント
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
>>141 SimpleConsole は?つかったことないけど。
rails っぽいフレームワークらしい
153 :
デフォルトの名無しさん :2007/09/06(木) 10:51:49
プログラミングRubyのライブラリ編は rubyのマニュアルに書かれている以上のことは どれくらい含まれているのでしょうか 基本的に不要ですか?
>>149 > bash 3.2.15(13)-release
これはcygwin?
なら\rも取り除かないと。
tasks = `rake.bat --silent --tasks`.split(/\r?\n/)[1..-1].map { |line| line.split[1] }
rubyでLispのprognのような一連の式を実行して最後の値を 返すような処理をさせたい場合、どうすればいいのでしょうか?
() とか begin end とか。
157 :
149 :2007/09/06(木) 19:34:05
おお、レスサンクスー
>>150 orz
>>151 Rake Command Completion は bash用のツールなので、それはないw
>>154 情報足りなかた
bashは、cygwinです。
rubyはwin32だったり、
なんか、混在環境なんだよな・・・
> なら\rも取り除かないと。
試してみるす!!
>manの読み方 マン ちなみに、manコマンドは マンコ マンド
unix 界隈での慣習として "名前(セクション)" という形で Unix のマニュアルのセクションにある項目を 示す、ってのがある man 2 send の 2 は、セクションを指示する引数
Windows環境でRuby使ってる人もいるだろうから、突然「send(2)を参照してくれ」 というのはちょっとやさしくないよね。 新しいリファレンスでは改善されてるのかな。 というか、新しいリファレンス大丈夫なのかな。。。
もうマニュアルのところにWindowsで使ってる人はまず、端末で format c:と打ってから Linuxを入れましょうって書いておけばいいよ。
時間の計算について質問です。 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) と出てしまいます。 どこがおかしいのか判らないのですが どう書けば良いのでしょうか? また、この計算で日付は使わないのですが 日付は必ず指定しなければならないのでしょうか? よろしくお願いします。
>>163 それは無理
Ruby ってどこかしら Unix セントリックなところが Ruby たるところだから
WIndowsで使ってる人の方が多いだろうになぁ
二分するなら別にそうでもないと思う でも、Windows用のダウロード数って結構あるんだっけ?
>>166 う〜ん…時間の計算は簡単には出来ないのですね。
Timeって時刻を扱うクラスだと思ってたので
これ使えば時間計算もすぐ出来るという考えは甘かったようで。
というか、Timeだけで日付も扱えるならDateの立場って…?
ともかく、ありがとうです。
「どう書けば良いか」は宿題スレの方が適切でしょうか?
特定の日付を持たない時間量、7812と2時間10分12秒を相互に変換できるようなものを表すクラスはRubyには無いと思う 引数から分や時を読み取って60や3600をかけるメソッドと 引数の数字を60で割って24の剰余を取って返すようなメソッドを自作するしかないな (今眠いから剰余だったかどうかはわからん) あと、Dateは日付だけが必要なもの、たとえば「2007年9月7日」を表すのに使う Timeだと「2007年9月7日x時x分x秒」という形でしか表せない(0時0分0秒とみなすことはできるが本質的には別)
>>163 以前は UNIX のシステムコールの類は全部リンクになってて
リンク先が
>>159-162 みたいな説明ページになっていたような気がするんだけど?
もうテンプレに ・Windowsユーザーは環境依存の質問・話題を振るのは禁止 って書いとけよ。ウザくてしょうがない。 身の程をわきまえろ。
Windowsユーザーですが質問が環境依存であることを判断するにはどうしたらいいんですか(><)!
判断しなくても、質問するときに自分の環境として
Rubyのバージョンと使ってるOS書いとけばいいじゃない。
てか、
>>1 に書いてあるしね。
>>175 そうすると「質問を振る」こと自体は避けられないので、
>>173 のような中二病が暴れるのは避けられません><
Windowsユーザーは
>>173 より下なんだから仕方がない
捨て身の展開にもっていく
>>173 が居た居たしいです><
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 ・・・・ とズラズラとログ?が残ってるみたいなんですが、 実際のディレクトリは空のままです。インストールする方法を 教えてくれるとうれしいのですが・・・
>>179 --prefix=c:/msys/1.0/home/ook/app
~~
気持ち良くないけど...
>>171 とても詳しい説明ありがとうございました。
時刻のみを表わすクラスや、時間量を表わすクラスを自作してみます。
>>170 >Timeだけで日付も扱えるならDateの立場って…?
Timeでも可能ではあるけど、1ヵ月後を求めるときはDateの方が楽。
Ruby.NETならTimeSpanクラス使えるのにね。
それはピュアじゃない。よって地獄に落ちろ。
>>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
をお薦めする。個人的には。
186 :
158 :2007/09/07(金) 19:44:51
>>159-160 ,162
ありがとうございます!勉強になります。
Windows環境でmswin32版使ってる者でした。
rubyなどのオブジェクト指向言語って、 何ができるからいいんですか? オブジェクト指向だとなにができるんでしょう? 流行に飛びつくかたちで導入したけどもそこがわからないので すっきりしない・・・
オブジェクト指向プログラム言語だと、オブジェクト指向でプログラミングができます! それ以上でもそれ以下でもないっす そもそもオブジェクト指向ってのはプログラミング固有の概念じゃない 「なでしこやひまわりだと日本語でプログラムできます!」と同じような感じ
>>187 オブジェクト指向なのがうれしいのは他人の作ったライブラリを使うときだよ。
データ型とそれ専用の関数があるわけだからながーいリファレンスマニュアル読まなくてすむじゃん。
しかも、新しいデータ型と関数(クラス)が欲しいけど、一から作るのが面倒なときに
人のものを継承してちょっと変更するだけで望みのものが得られる。
まあ、オブジェクト指向はモジュラー化の進化版だから自分でばりばり書いてれば
そのうちわかるようになるよ。
マ板に関連スレいっぱいあるからそっちで聞いておいで
191 :
187 :2007/09/07(金) 23:31:03
>>188-189 ごめん
自分の初心者度が上回ってほとんど納得できない;;
手続き型だって関数あるし・・・
Rubyインスコした動機も大学でFortran使って数値計算やってて
その反動みたいなもんなんだ。
>>190 逝ってきます
そもそも自分に必要ないかもしれないけど
マ板のスレはマニアさん同士が喧喧諤諤するスレであって、素朴な疑問を解消できる場所でもないような
ここでやるなってことだろ。 金曜の夜にするにはあまりにも危険が大きすぎる質問だ。
漢数字をアラビア数字にするスクリプトを組んでいるのですが SHIFT-JISを選択すると十の文字が化ける為に、\で補ってみているのですが上手く動きません。 EUCを選ぶと,premature end of regular expression: /\210・(RegexpError)と出てしまうのですが どうすればこのエラーを解決できるでしょうか。
ここに実際のスクリプト晒さないのは権利条項の制限か何かか? どうせ動かないんだし権利上も問題なくね?
>>194 ソースのコードと -K? を合わせてる?
ソースが SJIS なら -Ks
ソースが EUC なら -Ke
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 はインスタンス変数にしてもよしと思う人挙手
「別な用途で使いたんだがインスタンス変数に依存してて改造面倒過ぎたので丸々コピペしてほぼ同じメソッド作った」ということがあるので 「引数のカッコが消えるから」という程度の理由ではスコープ上げないことにしてる
199 :
デフォルトの名無しさん :2007/09/08(土) 16:13:52
モジュールMをインクルードした任意のクラスCで、以下のようにMで定義したメソッドをクラスのスコープで呼びたいのですが、どうすればよいですか? module M def hoge :hoge end end class C include M HOGE = hoge end
クラスもモジュールも書かないでどんどんコード追加してったら手が付けれなくなった 今からクラスにまとめたりするのめんどくさい コード自体まったくオブジェクト指向じゃない 人に見せられない おわた
201 :
sage :2007/09/08(土) 18:04:33
a.rbの実行結果を出力させずにhogeに入れたいです、 よい方法があれば教えてください。 #a.rb p "a" ------ #b.rb hoge = a.rbの実行結果 "a"
#b.rb hoge = `./a.rb` puts hoge
203 :
201 :2007/09/08(土) 19:16:38
質問というか確認させてください。 モジュールM1をインクルードしたクラスC1(メタクラス=C1') モジュールM2をインクルードしたC1のサブクラスC2(メタクラス=C2') C2のインスタンスc1(特異クラスc1が生成済み') というオブジェクト構成のとき、c1が受けたメソッドのコールオーダーは c1->c1'->C2'->C1'->C2->M2->C1->M1 でいいでしょうか?(表記がわかりにくくてすみません)
205 :
204 :2007/09/08(土) 22:52:26
↑頭がこんがらがっていて、滅茶苦茶なことを書いてました! c1とc1'はそれぞれc2とc2'とするべきだったし、オーダーも本当は c2'->c2->C2->M2->C1->M1 ですよね。 インスタンスオブジェクト(c2)の特異クラス(c2')は親クラス(C2)のメタクラス (C2')のサブクラスじゃなくてインスタンスなので、上のコールオーダーに入ってくる ハズがありませんね。 失礼しました!
>>199 class C
extend M
end
rubygemsについて質問なんですけど、gem installすると、たまにインストール 候補が複数出てきて、番号で選ぶ、みたいなのがあるじゃないですか (例: ruby-sqlite3) あれを、聞かれて入力するんじゃなくて、コマンドラインで最初から指定する 方法ってありますか?
Cで書かれたDLLファイルの扱いについての質問です。 .dllを利用するためにはWIN32APIから呼び出すようですが、 以下のような記述の仕方で簡単に使えるようにするライブラリーはないでしょうか? 意味不明なこといってたらスイマセン。 <例> dll = Xxx.new('xxx.dll') dll.hoge() dll.poge()
>>209 gem help install
で見て、なさそうなら
echo 3 | gem install ruby-sqlite3
または
echo 3 > hoge.txt
gem install ruby-sqlite3 < hoge.txt
パイプ処理やりダイレクトが動作しない環境もあるかもしれないしな 方法を2種類紹介するのは親切だ
個人的には「procカッコイイ」みたいな中二病設定法にみえてヤだ 現代的なプログラムなら素直に引数取れよバカと思うんだが、何かのっぴきならんメリットでもあるんだろうか
Rubyって標準のライブラリでグラフの描画ってできますか?
>>210 全自動でそれを可能にする仕組みはどこにもない。
Win32APIかdlを使って自分で作ればいいんじゃないか。
>>214 そーゆーのはRubyの仕事じゃないしねえ
標準のグラフ描画プログラム(そんなもんがあればだが)をシェルから呼ぶのが妥当かと
いくつか非標準のプロッタに依存したライブラリは公開されてるようだけど
ImageMagick(とGems)が要るGruffとか
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]
>>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
>217 こういうもんなんすかね、と言われるとこういうもんっすよ、と返すしかなかったりする。 「浮動小数点 誤差」でぐぐってみてくりゃれ。ちなみにRubyに限らないお話。
220 :
219 :2007/09/11(火) 01:40:42
……とっととリロードすべきであったな!! > 己 氏のうorz
一見同じように見えるが…実は微妙に違う。 $ 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
>220 同士よ…orz
223 :
218 :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
224 :
218 :2007/09/11(火) 01:46:22
>>219 ,221
乙です。
なんでみんなしてかぶるかな。
そういう自分も二度目の書き込みはリロード確認してなかったり……
>>217 require 'rational'
n = Rational(1, 10)
s = Rational(0)
10.times do s += n end
puts s == (n * 10)
>>216 諦めてruby上からgnuplotを呼び出してグラフを描きたいと思います。
ありがとうございました。
また質問で悪いのですが、小数点以下の桁数が大きすぎて
gnuplotにデータを送ると、オーバーフローしてしまうので
小数点以下の桁数を指定したいのですが、BigDecimalが思ったように動作してくれず、
Rubyのリファレンスにある任意桁の切り上げ等のメソッドも
定義してからどう使えば良いのか良く分かりません。
ご教授お願いします。
227 :
217 :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以降は減少に転じているのが面白いですね。
なぜそうなるのか調べてみます。
228 :
217 :2007/09/11(火) 02:31:29
>>225 ありがとうございます!
分数で考えることもできるんですね。
精進します。
ラッパじゃ意味ないだろ system()で起動するのとたいして変わらん
File.openでErrno::ENOENTが出る場合ってどんなの? ファイルが存在しませんって言われてもそりゃ新たに作るファイルなんだしオープン時点で無いの当たり前じゃん?
ファイルがディスク上に存在しなかったらファイルオブジェクト作りにくいだろ…常識的に考えて… ディスクに問答無用に書き込むだけのメソッドってどっかになかったっけ?
自力で rescue Errno::ENOENT したほうがいい というか、仮にそういう便利メソッドがあったとしても中身は rescue して touch して retry だと思うぞ
>>232 新たに作るんなら
open(filename, "w") とか
open(filename, "r+") とか
>>213 == 143?
optparseの話か?
procは必要だからこそ使われているわけだが、
「素直に引数取れよ」というのはどういう意味かな?
もうちょっと具体的に。
237 :
デフォルトの名無しさん :2007/09/11(火) 16:07:03
RUBYにはCPU使用率を調べるようなクラスはあるのでしょうか? よろしくお願いします。
239 :
237 :2007/09/11(火) 16:49:42
>>237 とか思って、別のサーバにて実行したらできました。
どうやらレンタルサーバ側の設定のせいだと思われます…。
いったいどこらへんに制限をかけているんだろう。
>>239 「できない」「できました」だけじゃなくて「どうできなかった」のか、
エラーになったのならエラーメッセージくらいコピペしろ。
一度静的に設定したら2度と変更しない変数を def initialize @workdir='/home/ore/hoge/' @savedir="#{workdir}/save" @today=Time.now end のように設定してます。 変更しないなら定数にしたほうが好ましいですか?
243 :
238 :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になるのは謎ですが、色々と楽しめそうです!
>>242 その例がインスタンスの初期化ならインスタンス変数で良いと思う。
コード全体としての初期化なら定数だけど、メソッド定義内には書けない。
>>230 GDChartはCのライブラリであってコマンドラインから起動するツールじゃないよね。
ライブラリのラッパーがなんでsystemで起動するのと同じなの?
>>242 インスタンス生成のときにまで値がわからない可能性があるんだべ?
もしそうならそれでいいと思う。いちおうattr_readerしとけば。
保存用ディレクトリ(の共通部)とかは定数でいいと思う 正規表現とかも定数に吐き出したことがあったけど大文字が気持ち悪くてインスタンス変数に戻した
248 :
デフォルトの名無しさん :2007/09/12(水) 20:31:26
可変な配列からはじめの二つを取り除いたものを返すにはどうすればいいでしょう? array.slice!(2..last) のようなことがしたいです。 array.slice!(0..1) だとはじめの2つだけ返してきます
>248 slice! の代わりに slice を使う。
251 :
デフォルトの名無しさん :2007/09/13(木) 17:09:48
なんという単語で検索していいかわからなかったので perl での $a -> ${a} の {}で変数を区別するrubyでの方法を教えて下さい。 system("program", "-f arg1.txt") のarg1を変数として認識させたいのです。
>>252 ありがとうございます。
こういうの名前ってあるんでしょうか?
Rubyでperldoc -m 相当のことを行うのはどうしたら良いでしょうか?
>253 式展開 Rubyリファレンスマニュアル → Rubyの文法 → リテラル → 文字列リテラル → 式展開
RubyでPostgreSQLに接続するにはどうしたらいいのでしょうか?
OSはWindowsXPを使っています。
ttp://ruby.scripting.ca/postgres/ ↑のページのWin32gem用というのを使えばいいのだとは思うのですが、
gemファイルの使い方が分かりません。
(拡張ライブラリを使ったことがありません)
ネット上でも本でも○○.tar.gzのUNIX系のコマンドのものしか見つかりません。
どなたか教えてください。よろしくお願いします。
スレちがい
259 :
デフォルトの名無しさん :2007/09/14(金) 10:25:29
呼び出し元のメソッド名を得る方法ってある?
caller[0][/in `(.*)'\z/, 1]
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 どうすればいいんでしょうか?
>>261 > lipo: can't open input file: /var/tmp//ccXJ6CfM.out (No such file or directory)
/var/tmpはある?
>>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
>>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
>>263 /var/tmpがあるかって聞いてるのに、なんで/opt/local/var/tmp作るんだよw
よく分からんが、-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用のロードモジュールを作ろうとしてる、という風に読めるんだけど。
>>261 こっちは問題なくインストールできる。
+universalつけるのやめて、port install ruby でやってみたらどうなる?
>>268 +universal つけないとふつうにインストールできます。
けど出来たバイナリーが Intel用か PowerPC用かわからないんで・・(どっかで見分け方を見た記憶があるんですけど忘れた)
+universalつけてもruby本体以外はちゃんとインストール出来てるんですけどね。
>>261 時間が出来たらやってみます。情報ありがとうございます。
>>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 困ってなくても好きなら割となんとかなる
278 :
デフォルトの名無しさん :2007/09/17(月) 21:13:15
>>276 ありがとうございます。
PGを目指すわけではありませんが、まったく知識が無いとちと辛い局面がたまにあるのです。
あと、何かとテキストを加工したり、コマンドオペレーションを自動化したいときに、何かひとつ言語を身につけておくと便利かなぁと。
つーか、いきなりRubyから入ったらCが余計にわかりにくくならないか
>>278 わからないことはグーグル先生なり質問スレなりに聞けばいいんでない?
>>279 漏れはCやってからRubyやったから、その感覚が残念ながらわからないんだよなあ。
でも、変数だの関数だの条件分岐だのの概念は変わらないから
大丈夫じゃないかな。。
資格取りたいかLinuxカーネルハクしたいか業務でC使うプロジェクトに放り込まれたんでもない限り Cなんて一生使う必要ないよ。やるだけ時間の無駄。 まあ後はRubyで拡張ライブラリ書くときくらいか。
Cを使う機会というより、Cをやっていないと他の言語の習得をするにあたって 「本物のプログラマ」にはかなわないと思ってるんじゃないかな よくオッサンプログラマのボヤキみたいなBLOGで 「最近の若者はCも知らずJAVA JAVAだ」みたいなのは多いから そういうのを心配してるんでは
>>282 それはオッサンのボヤキというより、ブロガーの職場の無能が愛想尽かされてるだけ。
__FILE__はどのような方法で行われているのでしょうか?
内部的な実装を知りたいということ?
>>285 はい、おおざっぱな仕組みでもいいので、この機能とこの機能を組み合わせて
実現しているというのを教えてもらいたいです。
パース時にリテラルとして埋め込んでる。
rubyインタプリタにcppかますオプションが欲しい今日この頃
>>285 そこに興味を持つならソースを読めばいいのに、という気はする。
ソース全体に対して__FILE__でgrepかければすぐわかるよ。
もう286が答えちゃってるけどな。
初心者以前の問題だと思うのですが失礼します
公式サイトのチュートリアルの
http://www1.tf.chiba-u.jp/~shin/tutorial/index.rb?Chapter=01 でputs 1+2で3になるそうなんですがなりませんでした
コマンドプロンプトについて調べはしましたが、知識足らずということはあったかも知れません
しかし、コマンドプロンプトはコマンド上で実行するためのもので
実際にファイルをクリックして実行しても結果は変わらないはずだと思うんです
普通に .rb ファイルをクリックしても3という数字は出てきませんでした(プロンプト画面が一瞬でて消えるだけ)
幼稚園児が大人に聞くレベルの質問で申し訳ありませんがよろしくお願いします
>>291 本当に初心者以前なので釣りだと思います!
一瞬表示されてすぐ終了してるんだよ ソースの最後に 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> こんな感じでいちいちコード書いて保存して実行する手間が省ける
.rbファイルを(ダブル)クリックしても実行結果は見えない …いや、見えてるんだが実際には「起動して表示して終了」が一瞬で行われてて認識できん コマンドプロンプト上からスクリプトを実行する方法を学ぶべし
>>292 残念ながら、釣りじゃないんですorz
>>293 おお、gets入れたら3でました ありがとうございます!
irbってのがよく分かりませんが勉強して参ります
>>294 cd フォルダ名 でファイルがあるディレクトリに移動する必要があるんですよね
こちらももっと勉強してきます
すみませんが、質問です。 Rubyには、引数を二つ取る算術関数はデフォルトで存在していますか? 例えばa + b の場合、aがレシーバで、引数はbだけです。 aとbの両方が引数になるような算術関数はあるのでしょうか? 具体的には、1から1000までの和を求めるとして、 (1..000).inject {|x, y| x + y} この後半のブロックに当たるような関数がデフォルトで存在していたら、いち いち無名関数を書くことなく、関数名を使ってProcオブジェクトを作れば済む と思ったのですが。 Haskellだとこんな感じです。 foldl (*) 1 [2 .. 1000]
297 :
296 :2007/09/18(火) 12:21:52
すみません、Haskellの例は、正しくはこうです。 foldl (+) 1 [2 .. 1000] 間違えて階乗のサンプルを写してしまいました。
>>296 たぶんない
module Enumerable
def sum
299 :
298 :2007/09/18(火) 12:47:40
スマソ、途中で書き込んでしまった module Enumerable def sum inject {|a, b| a + b} end end みたいに一回書いとけば、それ以降は(1..1000).sumだけで和が出せるけどな
1.9か、ActiveSupportを使って (1..1000).inject(&:+)
302 :
296 :2007/09/18(火) 14:24:20
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のスコープで振るまいが違うのは不思議に思える。
これについて何か統一的な理解の仕方はある?
>>303 暗黙の第二引数となるオブジェクトが存在して、第二引数が指定されない限りそのオブジェクトが毎回引き渡される、と理解すればよい。
305 :
デフォルトの名無しさん :2007/09/18(火) 18:41:08
306 :
デフォルトの名無しさん :2007/09/18(火) 18:43:23
>>300 横やりなのですが、Railsの本とかサイトみてて、ActiveSupportはこれができてすごいぜ!
みたいなのを、見かけるのですが、いまいち利点がわからんです。
>>296 さんの言うみたいに、ブロックなしに関数渡せるよ、ってぐらいなんでしょうか
[1,2,3] [100,101,102] => [101,103,105] のように二つの配列を受け取ってその各要素の合計を要素とする配列を 得たい場合、Rubyらしく書くにはどうしたらいいのでしょうか?
>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]
がーん
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] ぬう
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]
>>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に渡されてない
{ } と do end の結合度の違いだな p() do 〜 end と解釈され p() にブロックが渡されてしまっている
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 になった。
>>316 こうゆう事でしょ
p(a.sort) do |x,y|
y<=>x
end
314,315 が言っているように sort() ではなく p() にブロックとして渡されるが
p() がブロックを処理しない(と思う)ので何も起こらない
じゃあ do ... end って何のためにあるの?
へ?
>>318 まあ可読性の為に使ってる奴が大半(俺含む)だろうが、あえて
open ごにょごにょしてファイル名を割り出す処理() do 〜 end
なんて結合度依存コードとかどうよw
つまりRubyは、パッと見のところだけ美しいだの他言語のいいとこ取りだの言ってるけど、 本質的には美しくも何ともない、行き当たりばったりの糞、ってことでFA?
パーザの動きを読むのが難しいんだよな。 書いたコードがどこで区切られ、どういう構造に分解されるかが判りづらい言語。
別の目的でそのように書くこともできるというだけであって、普通に書くぶんにはそれほど問題にはならない perlは記号で呪文のように書くこともできるが、perlはそういう言語というわけでもない
少なくとも返り値使う時や一行で書く時は{ ...}を使う ってことを守ってればいい。
手元にある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は、ブロックに手続き的な意味合いを持たせ > たい時に用い、関数として戻り値を求めたいときは、{…}を使います。
俺はブロックではdo-endは使わない。 フロックローカルスコープが導入されるときは{}を使うと決めて、do-endでスコープが 変わらないように気をつけているから。 ブロックローカルスコープのわかりにくさがRubyの欠点の一つだと思っているので。 だから、whileはdo-endだけど、loopやeachは{}で書く。
だからっつーか、whileは{}でかけねーだろ
漏れはほぼ全部do〜end使ってる。 前田修吾さんのコーディング規約にできるだけ沿ってる
1行で済むブロックは{}で複数行のはdo,end使ってる
>>327 do-endと{}ってスコープの扱いいっしょじゃないの?
おれもおもった
どっちか一つにしなさい!
なんで?
俺は使い分けるの面倒くさいから全部 { } だなぁ
336 :
デフォルトの名無しさん :2007/09/21(金) 16:44:42
質問します。 rubyのプログラムは、メソッドがメインで、それをまとめたり、 扱いやすくするためにクラスや変数がある、と認識しています。 この認識は合っているでしょうか?
全然違います メインとなるものを知りたければオブジェクト指向でぐぐってください
てきとーにまとめるのにつかうのはクラスではなくモジュール まあ、 HogeApp.new.run で終わってるようなスクリプトも多いけどな
339 :
デフォルトの名無しさん :2007/09/21(金) 17:10:06
336です。 一通り調べたところ、メインとなるものはオブジェクトそのもので、 それを使ってプログラムを組んでいく。そのための補助というか、 プログラムをしやすくするためにクラスや変数やメソッドや モジュールや配列、ハッシュ(ryがある、と思いました。 ご意見頂ければありがたいです。
学校の宿題かなんかか
341 :
デフォルトの名無しさん :2007/09/21(金) 17:47:41
336です。 いえ、来年春に大卒文系でSierに就職する者ですが、就職前の修行のために しているインターン(就職先とは別の会社)で、「rubyで作られたこの アプリ(グループウェア)の機能をすぐに付け足せるくらいのレベルに なって」と言われ、rubyとrailsの勉強をしているところです。 最初はrailsの勉強から入りましたが、わけがわからないのでrubyの勉強 から始め、今に至ります。
342 :
デフォルトの名無しさん :2007/09/21(金) 17:49:33
336です。 なお、見ての通りですが、超がつく未経験です orz
習うより慣れろで、プログラムいっぱい書いてるうちに見えてくるかも
344 :
336 :2007/09/21(金) 18:02:16
>>343 ですよね・・・。
ruby入門の本は何冊か買ってありますが、本に書いてあるプログラム
をそのままコーディングしてちゃんと動いたのを見届けても、あんまり
楽しくないですし、身になった気もしません。
自分としても一つ自力でプログラムを組みたいのですが、どうすれば
プログラムを組めばいいのかもわからず・・・ orz
ところでrubyの先輩方に質問ですが、何かプログラムを組むとき、
「こういう働きをするメソッドが必要だ」となったとき、そのメソッドは
どうやって探されてるんでしょうか?
概念を学んでも意味ないよな そんなにきっちりした言語でもないし
>>344 俺は他言語(Java)から移行してきたんだけど、
リファレンスを勘でクラス名で検索してなんとかなってる
347 :
336 :2007/09/21(金) 18:12:48
>>346 すみません、「ruby リファレンス」でぐぐるといくつか出てきましたが、
どのサイトを使われているのか教えて頂けませんか?
349 :
336 :2007/09/21(金) 18:19:10
350 :
336 :2007/09/21(金) 18:20:02
Duck Typingだから振る舞い=メソッドが中心で いいと思った。
352 :
336 :2007/09/21(金) 18:27:48
質問、もう一つさせてください。 先輩方は、「こういうプログラムを作ろう」と思ったとき、 どのような流れでプログラムを組んでいくのでしょうか? 自分が考えるには 1 プログラムを構成する一つ一つのプログラムの因果関係や、 処理の流れを決める=アルゴリズムの決定する 2 一つ一つのプログラムを組む。 3 テスト こういったところでしょうか?
一人でやるなら「こういうプログラムを作ろう」ってより、 プログラム書きながらテストしながら考えて、 できあがったものが「そういうプログラム」って感じ
354 :
336 :2007/09/21(金) 18:41:17
>>353 なるほど、まさに習うより慣れろなんですね。本読むよりはプログラミング
を実際にして慣れる。「こういうプログラムを作ろう」と考えてから
プログラミングをするよりは、考えながらプログラミングするんですね。
有難う御座いました。
次の質問です。rubyにはメソッドの数がかなりありますが、先輩方
はどうやってメソッドの検索をされてるのでしょうか?
http://www.ruby-lang.org/ja/man/ を見ましたが、メソッドの一覧
などがなかったので、どうやって先輩方はメソッドを検索されてるのかな、
と疑問に思ったので。(よく使っているメソッドは暗記されてると思い
ますが)
>>352 エディタと irb 起動。リファレンスも開いておく。
クラスは、とりあえず思い付いた分をエディタで書いて irb にロード。
メソッドは、思い付くまま短いコードを irb で打って試し
「これがよさ気」と思ったらエディタで打ちこむ。
打ち込んだら irb へロードしてメソッドに色々引数渡して試す。
んなことを何度か繰り返した後、irb を終了し ruby に渡して実行。
RubyUnitとかは使ったこと無いが、使えると楽なのかも。
356 :
336 :2007/09/21(金) 19:03:16
>>355 irbというのもあるのですね。知りませんでした。
ruby script/console のようなものでしょうか。
>>352 1 とりあえず中身は空のただ実行できるだけのミニマムなプログラムを作る
2 何行か必要そうなコードを書いてみる。
3 動かしてみて、あと何が足りないかを考える。
4 満足するまで2に戻る。
358 :
336 :2007/09/21(金) 19:14:40
>>357 人によってそれぞれプログラミングの方法は様々なんですね・・・。
勉強になります。
359 :
336 :2007/09/21(金) 19:32:22
埋もれてしまっているので、もう一度書きます。
次の質問です。rubyにはメソッドの数がかなりありますが、先輩方
はどうやってメソッドの検索をされてるのでしょうか?
http://www.ruby-lang.org/ja/man/ を見ましたが、メソッドの一覧
などがなかったので、どうやって先輩方はメソッドを検索されてるのかな、
と疑問に思ったので。(よく使っているメソッドは暗記されてると思い
ますが)
>>359 リファレンスをとりあえず全部読む。
その時点でメソッドを暗記する必要はなくて「どっかこのあたりにこんなことが書いてあったような」という程度の記憶が得られればいい。
あとは必要になったときにその記憶を頼りにしてリファレンスを見直すだけ。
というかさ、プログラミングとか関係なく、本(小説じゃなくて実用書)を読んだりする時もそんなもんじゃね?
361 :
336 :2007/09/21(金) 19:53:37
>>360 なるほど、リファレンスを一通り読んでからは、あとはケースバイケース
でメソッドを探していくんですね。
有難う御座います。
前もどっかで書いたけど、Webサイトのマニュアルは鯖負荷が上がるので読まない 何らかの手段でローカルでアーカイブしてくれてるものを普通ありがたく使う(HTMLヘルプ版とか) クラスとメソッドは、ArrayとEnumerableとStringとHashの4つは常に眺めておく 何か面白そうなのないかなーと普段から眺めておくと、使いたいときにひらめく …まあ、このへんはたのしいRuby第2版あたりの入門書籍読むのでもいいんだけどさ 他のクラスやメソッドはGoogleで適当に検索すると適当な使い方をしてるブログやサイトが引っかかる
363 :
336 :2007/09/21(金) 20:16:04
>>362 ああ、そういえば買ったのに「たのしいruby」を放置してました (汗)
なるほど、手段は色々あるんですね。勉強になりました。みなさん、
有難う御座います。また来ます ノシ
>>364 > でもこれにはリファレンス参照用ツールとしてriとrefeが紹介されているけど、初心者のことを考えると
> 『Windowsユーザの場合はchmファイルを開いて検索しましょう』と書いておくべきだよな。
編集部にフィードバックしたってください
366 :
327 :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 で
そこまで理解できるやつはエスパーだわ。
whileやuntilのdoは省略すると決める ルールでも出来るな>見た目でスコープの有無
いや、なんつーか、こういうブロックでスコープが被って本当に困るのか? そんなにまでおまえら変数名を使いまわししてんのか?
>いや、なんつーか、こういうブロックでスコープが被って本当に困るのか? なにいってんのお前? 「こういうブロックでスコープが被って」?スコープが被るって何だよ。 意味不明なこというな。 >そんなにまでおまえら変数名を使いまわししてんのか? はぁ?変数の使いまわしと何の関係があんの?
初心者スレで煽り叩きはみっともない
まぁ、どこでやってもあんまり見栄えのするもんじゃないよな。
vrubyってクラシックな視覚スタイルしか作れないのですか? 無いとしたら、今後XP(Luna)やVista(Aero)の対応予定とかありませんか?
>>359 「Rubyレシピブック」も必携だと思う。
いつもこれをちらちら見ながらコード書いてます。
>>369 困るのは変数の名前が被ることじゃないだろ
とエスパーを試みる
% ls -l */*/*/*/*/*/*/*/*/* sh: /bin/ls: Argument list too long って言われましたが、ルビーなら階層深くてもおk?
シェルが出してるから無理だろ というか ls -R や ls -R1 や find . -print では何か不足?
dirs = Dir.glob("*/*/*/*/*/*/*/*/*") puts dirs.sort とすれば、シェルの制限を回避できるんじゃね?
レシピブックは糞だから間違っても買わないように
なんだ、まだ恨んでんのか
Rubyは死にゆく運命にある言語だからあまり入れ込まないように
なんか便利な感じの「ひらがなだけマッチする正規表現」とか「2バイト文字だけ正規表現」とかの定数って 標準のどっかで定義されてたりしません?
日本人のための言語じゃないからねえ。 自分で実装したら?
ある値が数値かどうか判別するにはRubyではどうするのでしょうか?
ある値.kind_of? Numeric
個人的なものならむしろ Integer() してしまう俺
整数になっちゃうじゃん
ああ「数値」かw じゃ Float() 型チェックより変換しちゃう方が性に合うんだよな〜
浮動小数点数になっちゃうじゃん
ある文字列が数値かってことじゃないの? 正規表現でチェックできると思うけど。
392 :
385 :2007/09/25(火) 10:17:10
自分がやりたかった処理はkindofでできそうです。ありがとうございました。 ところで手元のピッケル本を見るとinstance_of?やkind_of?の引数の 部分にclassではなくklassと書かれてるんですが、これは何か意味があるんでしょうか?
>>392 classは予約語だから変数名として使えない。かわりにklassを使っている。ただそれだけ。
hash[key] += 1 をキーが無い時にやると undefined method `+' for nil:NilClass って怒られるんだけど、例えば値のデフォルトをFixnumにして怒られないようにすることはできるのでしょうか?
>>394 hash = Hash.new(0)
詳しくはマニュアルのHashのページのデフォルト値関連を読む。
>>383 onigurumaにはあるからruby 1.9以降では使えるかも。
試してないけど。
397 :
394 :2007/09/25(火) 13:01:01
SQLite3をJRubyから利用したいのですが、 "no driver for sqlite3 found"となってしまいます。 いろいろな場所に、sqlite3.dllやsqlite3_api.dllを配置して試しているのですが変化ありません。 同じソースでrubyから実行した場合は、 dllをロードしてテーブル操作もできます。 また、sqlite3を使用しないでJRubyから呼んだ場合もエラーにはなりません。 DLLの配置場所や指定方法の問題と思っているのですが なにかチェックした方がよい点などわかりますでしょうか? どこかにドキュメントなどがあればその場所でもよいです。 ActiveRecordを利用して require 'active_record' require 'sqlite3'
どーでもいいことだが、変数名にhashは使わんほうがいい。
401 :
398 :2007/09/25(火) 15:10:59
>>400 Javaから呼ぶ場合のDLLが違う場合があるということですか?
今まで気にしなかったので、使えるのかどうか不明です。
どこを参照すればわかるのでしょうか?
ruby.exeをコマンドプロンプトから起動した場合に
使用するDLLと同一なものを使えると思っていました。
>>399 釣りはアンチスレがあるんでそっちで
300歩譲っても質問スレでオリジナリティのある変数名にする理由を思いつかん
今日の年月日のディレクトリに適度な名前のファイルを作成して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がいいような気がします。どんなもんでしょうか。
405 :
デフォルトの名無しさん :2007/09/25(火) 18:10:55
使える関数や危険な操作を制限してユーザから入力されたコードを実行したいのですが、 どのようなやり方が適しているでしょうか?
>>405 ラッパーを作る
ユーザーに生Rubyスクリプトコードを入力させる場合の運用ポリシーは2つしかない
全部許すか、そんなこと一切させないか、どっちか
>>407 そんなものを信じていると、きっと後悔することになります
409 :
398 :2007/09/25(火) 18:58:09
JRubyからsqlite3を使用 require 'sqlite3' db = SQLite3::Database.new("data.db") #<RuntimeError: no driver for sqlite3 found> ってなる rubyで実行するとエラーにならない
>>402 おいおい。なんでアンチ?
Objectクラスにhashというメソッドがあって(つまり全クラスにあって)
それとかぶるからhashという変数名は使わないほうが良いよってだけじゃ
ないかな。実際、使って困ることはまずないけど。
名前がなんでもいいときは、aHash とかにするといいんだぜ?
>>409 そりゃそうだ。JRubyからCRuby用の拡張ライブラリは呼べない。
SQLite の JDBC ドライバを持ってきてそれを使えばいいんじゃね。
webrick/httpproxyでuseragentなどHTTP_HEADERを変更する方法ってどのようにするのでしょうか?
>>413 JRubyからactive_recordは使えないのですか?
>>411 Ruby で変数やメソッド名に camelCase 使うのって好きじゃないんだよな…
というか、aHash というつづり自体が
アハーッシュ♥
という感じでバカっぽい
何も考えてないハッシュです、という意思表明には h が無難なのかね
418 :
394 :2007/09/26(水) 14:02:33
変数がハッシュだよというためだけにhashって書いたのに... Arrayでも同じなんだろうなと思ったら、size指定した範囲しかデフォルト値与えられないジャン。 中途ハンパだなぁ。
large_range.include?(small_range) が (俺の) 思った通りの動作をしてくれなくてはまった。 リファレンスマニュアルの見出しには、 self === other include?(other) (ruby 1.7 feature) とあるんだけど、 other だと self と同じクラスのインスタンスを想像してしまうので、 other じゃなくて item とかの方が良いように思う。
>>418 Perl のスレで、コード例の変数に $a や $b を使うと怒られるのに似てるな。> hash
>>418 まーでも、そのコードをコピペして動かそうとしたときに
誤動作が起こる可能性があるから、やっぱり変数名にhashは止めたほうがいいと思う
>>420 それとは別だろう
hashという名前の関数(Kernelメソッド)があるから指摘されたわけで
422 :
394 :2007/09/26(水) 17:15:37
>>421 hashは使わないようにするけど、そのKernelメソッドってのがわけわからんわ
オブジェクトなしで呼び出せるメソッド=Kernelメソッド=Objectクラスのメソッドで合ってる?
副作用があるなら予約語にするべきなんじゃないの?
せめてリファレンス読め
当面って... 組み込み関数+Objectクラスのメソッドとしか読み取れない
>>421 いや、perl で $a, $b は特別な意味があるんで。
>>427 でた、Perlのバッドノウハウ
ほんといけてないよなPerlは
>>430 sortの中で、$aと$bに比較対象が渡されてきたような気がする。
432 :
420 :2007/09/27(木) 01:03:53
意外と知られてないのかな・・・
Perl関連のスレでは何度か出てる話だよね。 一部の組み込み関数を呼ぶ際に $a と $b を使うから $a と $b はそれ以外の目的で使わない方がいいって話。
>>433 sortに、比較関数をわたすことができるんだけど、そのときにmyなしでいきなり$aと$bを使えるようになっている。というか$aと$bを使うようになっている。
これを知らないと、use strictしても、myなしの$aと$bがエラーにならず、はまる。
まさにバッドノウハウ。
ほんといけてないよなPerlは
バッドノウハウという言葉の使い方が間違ってると思われる件
>>434 バグと言っていいレベルの仕様だな。
当然,Perl6では直ってくると期待。
Ruby2.0レベルに期待しておく。
438 :
420 :2007/09/27(木) 12:07:18
「バッドノウハウ」とか言い捨てるのは勝手なんだけど、 use strict すらなかった昔の仕様の後方互換性を保つためにそれだけ配慮してる、 という見方もできるんじゃないかな。 後方互換性を取れば「バッドノウハウ」と言われ、 バッドノウハウを排除すれば「後方互換性を考えてない」と言われ、 言語を作るとはかくも辛い仕事なのだなあと思ってみたり。
Perlは$a、$bだけだけど、Rubyはhash以外にも山ほどあるってことでRubyの負け。
>>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 >全部オブジェクトへの名札にしか過ぎないのに
それは言語実行側の目線
プログラムを作る側としては、
ロジック(メソッド)とデータ(変数)は別物として扱う。
変数に、メソッドへの参照が突っ込めれば便利だけど
区別はしたいと思っている。
そんなマジレスされてもみんな困ると思うぞ
>>441 logger.debug b.inspect
または
logger.debug b.class.name
として、bが何か調べよう。
446 :
デフォルトの名無しさん :2007/09/27(木) 20:59:52
ruby -rtracer a.rb でトレースできるのはうれしいんだけど、 メソッド名だけが出てくるようなオプションはないすか? 例外のスタックトレースみたいなやつ
あります
phpでいうところのmb_substr(perlのsubstrのマルチバイト版) みたいなのはいろいろ手を加えないとできないのでしょうか? スクリプトコードはutf-8にしているのですが文字列で扱う方法が 分からなくて困っています。
str.split(//u)[idx, len] とか。 1.8までだとこれぐらいじゃないか
450 :
448 :2007/09/28(金) 15:58:49
なるほど、splitでunicode化ですね ただこれだとめっちゃ遅くなるんで特化したのはないのかなぁと 1.9だとまた事情かわるんでしょうかねえ
そもそもそれはsubstrを使う必要のある処理なのか? もっと簡単なメソッドで代用できるのならそっちの方がいいよ
452 :
448 :2007/09/28(金) 16:17:28
特に困っているっていう記事はぐぐっても見あたらなかったので あまり皆さんはマルチバイト意識したsubstr使わないんでしょうかねえ… Perlでも力業をつかえばできなくないのですが、 スクリプトベースで遅いのが難点なので rubyはこの辺なんとかなっているのかなと思った次第です 1.9のm17n化ってのがそれっぽいのかな? バイト単位を文字単位でってやつですね
scan split sub gsubで事足りてるからなあ。
454 :
デフォルトの名無しさん :2007/09/29(土) 06:47:58
>>452 割と普通に困ってる。
ふと気を抜いて使うとももろボトルネックだし。
utf8くらい自由に扱えるようにしてほしい。
C言語なんかじゃ、文字列処理が弱すぎるせいでsubstrを使うことはあるが、 Rubyとかの文字列処理が強い言語で、substrという原始的な関数を使う場面があまり無いと思う。
他の言語で○○を使っているのでRubyでも「使わないといけない」という論調はよく見るな 具体的にどういう処理をさせたいのか話してくれれば自分で下手な処理書くよりもベターな案があるかも
同じ機能がなくても同じ結果は生み出せるだろうからね。
458 :
デフォルトの名無しさん :2007/09/29(土) 21:01:23
BASICみたいにLEFT/RIGHT/MIDで何でもやってしまう人よりはマシ
PやRだと何でも正規表現でやりたくなるな
RSpecとかよくわからん 実際具体的にはどういう風にスクリプト作っていけばいいんだ?
>>460 るびま21号読んだ? かなり具体的に書いてある
俺も今RSpecを使ってやってるけど、コツを人に説明するのは難しいな
「こんなライブラリ/アプリを作りたい」というのがあればアドバイスできるかも
465 :
462 :2007/09/30(日) 15:43:32
レスありがとうございます。こんなはずかしい罠にはまってたとは…トホホ しかしGoogleさん面倒なことしてくれるなぁ 72.14.192.0/18 で振り分けるにはちょいとデカすぎる気がするし これ全部キャッシュサーバーならいいんだけど…どうしたものやら…
外付けHDDなどにruby本体をいれ インストールされていない環境で動かしたいのですが可能でしょうか?
mswin版のzipのヤツは実際にUSBメモリ入れたまま直接動かしたことがある。 問題はなかった。元々解凍してそのまま使えるんだから当然か。
468 :
466 :2007/09/30(日) 17:15:48
PATHを通すことができなければ動かないですよね?
470 :
466 :2007/09/30(日) 17:28:30
>>467 >>469 ありがとうございます
portable rubyと言うのを試してみます
それがダメなら組み合わせられるやつを試してみます
ありがとうございました
たぶん、InstantRailsが楽で良いんじゃね?
俺はNYAOS + JmEditor2 + ruby-mswin32で 他のPCですぐに使えるようなパッケージを作ってた (ついでにExerbやVisualuRubyも入れて) 大学やなんかのPC使うなら、エディタも一緒に入れておくと便利
>>461 テスト作りながら開発、というのはどっかで対人で習ってやったことないとわからんと思う
件の記事だってTest::Unitを使ったことがある人前提だったろ
配列を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]です。
無理、あるいはputsの再定義をすべきではない。 配列を事前に細工したものを渡すか、puts_listとかそういう名前のメソッドを新たに作るべきと思う。
macでruby/sdkをうまくインストールすることができません どうすればいいでしょうか versionはruby 1.8.6 p110 mac os x 10.4 です
477 :
467 :2007/10/01(月) 20:38:13
すみません間違えました sdkじゃなくてsdlです
478 :
476 :2007/10/01(月) 20:39:00
さらに番号まで間違えてしまいました
どこまでやって、どんなエラーがでたのかくらい書かないと
480 :
476 :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.)
482 :
476 :2007/10/01(月) 21:19:57
ありがとうございます SDLをインストールしていなかったのが原因だったようです
>>474 puts は渡されたオブジェクトの to_s の結果を出力するので
def to_s
@name
end
の @name を @name[0,3] 等、好きなように書換えれば良い。
ただし to_s を利用するメソッドに影響が出る事を忘れるな。
# 何をしたいのか解らんが、方向を間違えてるような気がする…
> to_s を利用するメソッドに影響が出る
だからやるべきじゃないんだよね…
>>475 のやり方が妥当だと思う
listの特異メソッドとして、または Arrayを継承したElementListクラスを作って to_sをオーバーライドするとか
>>485 そりゃRubyは標準のクラスやメソッド勝手に上書きすりゃなんでもできるけどさああああああああ
Rubyの勉強のためのコードならまだしも、実際に使うスクリプトではやってはイカン動作だと思うが…
自分用ののスクリプトだったら何でもアリだと思うけどね 目的のためなら実装の美しさに目をつぶることもしばしば
いやいや、継承で違う配列クラスを作れって言ってるんじゃないのか
標準ライブラリの再定義とは全然意味が違う
>>474 が何をするかによるが、見た感じ出力用のメソッド作るより妥当な気はする
Elementクラスのto_sの話のような気もしないでもない。
ちょっと質問です。 gemでインストールしたライブラリのドキュメント(rdoc、ri、readmeなど)を参照したい場合、 エクスプローラでrubyのディレクトリから階層をたどっていって直接開くしか方法はないのでしょうか? かなり面倒なので、操作を簡略化したいのですが・・・。 なにか簡単な方法があれば教えてください。(みなさんどのようにしていますか?)
492 :
491 :2007/10/02(火) 02:02:36
もうひとつ。 riの検索にrefeを使っているのですが、gemでインストールしたライブラリのメソッドも 検索対象にすることはできるのでしょうか? こちらも、もし分かれば教えていただきたいです。 よろしくお願います。
>>490 >>474 はElement#to_sをわざわざ@nameと定義してる。
つまり、Element単体では@nameを返して欲しいんだと思う。
でもElementの配列には@name[0,3]を返して欲しい、ということじゃないのか?
>>485 は別に標準クラスを弄るんでなく、クラス作れって話。
特異メソッドやArray継承はputsがどうやって配列から値を取り出してるか解らんので保留。
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。 しかしなんとなく良心が痛む。
それだと結局putsの再定義のような…w
前スレ 959 で FreeBSD ports でインスコできる HTML パーサを質問した者ですが、 いつのまにか Hpricot や scrAPI が ports 入りしておりました。 ports メンテナさんありがとー。
"定義ファイルabcd"のように、日本語+英字とかの組み合わせから英字のみを抽出したいのですが、 name1 = /[a-zA-Z_]+/.match("定義ファイルabcd") p name1 # => "t" と、なってしまいます。 正規表現の部分を、\w+とかにかえても同じです。 [abdcb]+とかだと抜き出せるみたいです。[abdcbt]+だとダメでした。 環境は、ruby-1.8.5-i386-mswin32で、文字コードはデフォルトです。 どのように指定したら、英字のみを検索することができるのでしょうか?
> 文字コードはデフォルトです 正規表現に関連する文字コードの勉強しとけ 原因わかったし小手先で直ったが、たぶん理解できずにまた同じ間違い犯すから
pにMatchData渡してそんな出力得られたっけ? 自分1.8.2くらいだけど どっかで変わったのか? それはともかくmatchする文字列の文字コードに$KCODEか正規表現オプションを 合わせる。
>>500 p すると #<MatchData:0x2e25188> のように表示「されなければならない」と思うんだけどね。
バージョンによって違うのかも。
502 :
476 :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 どうすればいいいんでしょうか
エラーが出たらエラーメッセージで検索する
変数名で困ってます。 * filename: 'foo/bar/baz.html' を2つに分けて * dirname: 'foo/bar' * basename: 'baz.html' にします。さらにbasenameを分けたとき、'baz' の部分は何と呼ぶのが一般的ですか。 * ???: 'baz' * extension: '.html'
basename は baz filename が baz.html extname(ext)が .html なに、File.basenameとできる文字列の名前の対応が違う? File.basenameは拡張子削る機能が標準でついてるだろ? もともとのシェルコマンドのbasenameにもついてるはずだ
>>504 それ呼び名はあるのかな?聞いたことないや
XXX. がprefix、.XXX がsuffixなら、真ん中はrootじゃない?
漏れの好み: path: 'foo/bar/baz.html' dir: 'foo/bar' filename: 'baz.html' basename: 'baz' ext: 'html'
>>508 妥当
何も説明がない場合は俺は少なくともこれだと理解する
filenameにはDOSでいう拡張子が含まれてるし、pathはいわゆるフルパス
510 :
504 :2007/10/04(木) 21:24:30
みなさん回答いただきありがとうございます。
今後は
>>508 の方針にしたがって生きていくことにします。
ソースの読みやすさには型よりも名前の方が重要だと気づいた今日この頃
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(/"/,"”")
〜後略〜
これが精一杯で綺麗な方法が思いつきません。こんなのを全部で数百回繰り返すのは、
さすがにイヤなのですが、もう少しスマートなやり方は無いでしょうか?
よろしくお願いします。
>>511 a01、a02・・・じゃなく配列にしてぶん回せば?
513 :
511 :2007/10/05(金) 02:35:13
>>512 お返事ありがとうございます。
配列にすると、処理の本体の方への波及が激しそうなので断念しました。
出来れば、あまり構造を変えない形でお願いしたいのですが…
せっかくレスいただいてるのに後出し条件になってしまい本当に済みません。
配列化しか順当な方法が無い感じでしょうか?
もしそうなら、覚悟を決めて本体処理側も変数名を変えていきます…
そりゃ綺麗な方法があるとは思うけど単純に打つのが面倒なだけなら evalすれば。 1.upto 54 do |i| eval("a%02d.gsub(/,/, ', ')" % (i +1)") end とか
面倒でも配列に直した方が確実に良くなるよ
どうしてもそれが出来なくても、配列で処理してから「a01,a02〜」へ代入するか、
「a01,a02〜」が入った配列を用意するとかで多少すっきりするかも
個人的にはeval使ったら負けた気になる(けど
>>511 が求めてるのは
>>514 なんだろな)
tab区切りに変えたら?
>>517 >それより、一つのテーブルに54もフィールド作んなよ
それ以上のも結構あるよ
自慢すんなよ
ああ、 …なんだかわかりやすさが微妙ですが使ってみることにします
そもそも素直にaを使えばいいと思うのだがどうか
即廃棄する配列作るのヤなんだろ
分かりやすく書くことが目的なんだから本末転倒だな
それに、最初の例と比べて「わかりやすさが微妙」であるようには思えないなぁ。
そんなことより聞いてくれよ Emacsで書いてたスクリプトの長い長い正規表現を手直ししようと思ってマウス使ってirbにコピペしたんだ どうしてもそもそも違ってる感じでどうしたのかと思ったらEmacsの折り返し記号の \ ごとコピペしてたんだよ 許可するから笑っていいぞ
>>527 ココはオレの日記帳だ
オマエはチラシの裏に書いておけ
自身のプロセスがどのポートへバインドしているかどうかって簡単に分かりますか? `netstat -lnp | grep #{Process.pid}` で結果をパースする方法か、サーバプロセスのソースをちょっと弄る方法が あるかなぁと思っているのですが、あんまり賢くないような気がしていまして。。 何か良い方法があったら教えて下さい。 宜しくお願いしますー。
531 :
デフォルトの名無しさん :2007/10/05(金) 19:31:30
すいません、イテレータとブロックって別の事を指すと思っていたのですが 同じ物なのでしょうか?
Rubyでは同じもの 言葉としては「イテレータ」には「繰り返し(イテレーション)」に 使うもの、という意味合いがある
イテレータは概念に近い。 hogee{|e| … } とか hoget do |e| …; end とかの「メソッドのケツにブロック」を用いて繰り返しをすると それはRubyでは歴史的にイテレータと呼ばれる。 今は(繰り返しの)「ブロックつきメソッド」とかいう注意深い表現をするけど。 昔は全部イテレータって呼んでたんだけど、「繰り返さないイテレータってイテレータじゃねーよな」ということになった。 別にイテレータでもいいんだけどねえ。
yieldって何て読むの?
漏れはイールドと
536 :
デフォルトの名無しさん :2007/10/06(土) 08:29:53
外付けHDDを見てたら、↓がでてきたんだけど、 3年も前に1.9出てたの? ruby-1.9.0-20040519-i386-mswin32.zip
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 です。
>>536 4年前からある。
1.8(安定版)1.9(開発版)なので、
1.8.0がリリースされたときから1.9はあったよ。
イテレータを使うにはyieldが要ーるど なんつて
Hpricot は ハプリコット
ュィールド
>>538 1.8.0がリリースされたときはまだなかったと記憶してるが。
1.8がtrunkじゃなくなったのは1.8.1を出すときだったはず。
545 :
537 :2007/10/07(日) 02:27:47
>>539 templateとだけ言われても・・・
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"]になるのにはどうしたらいいのでしょうか?
>>547 $ cat echo.sh
#!/bin/sh
echo $1
$ echo "hoge"
hoge
$ ./echo.sh "hoge"
hoge
$ echo "hoge" | ./echo.sh
$
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以外触っていません
なんでだろ。 image/nos_front.pngが見つからないって出てるけど、 サンプルパックにはimage/nos_front.pngがあるよね・・・ カレントディレクトリが違うとか。 どこのディレクトリで実行してる?
551 :
549 :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] です
>>547 スクリプト起動時に指定されたファイルの内容と、
パイプ経由で読み込む内容を同一視するのならわかりますが、
やろうとしていることが、いまいち分かりません。
私もRubyについて詳しくはありませんが、
標準入力から読もうとした場合、ARGVは nil または 空白に
なるのではないでしょうか。
>>547 そうゆう非標準的なものは普通用意されてないもんだ。
これでがまんしろ
hoge = ( 0 < ARGV.size ? ARGV[0] : $stdin.gets.chomp )
ちなみに標準的ってのは cat とか less とかのことな。これなら ARGF でいける。
554 :
デフォルトの名無しさん :2007/10/08(月) 00:28:08
ライブラリ内で 日本語コメントが 使えない
556 :
デフォルトの名無しさん :2007/10/08(月) 00:53:21
>>555 d
マジっすか (´д`)
確かに、ライブラリだと、-Ksとかできないな・・・
557 :
555 :2007/10/08(月) 02:24:18
たぶん実際にはもっと色々ある 俺が期待してるのは、ライブラリのエンコーディング指定ぐらいだけど
558 :
デフォルトの名無しさん :2007/10/08(月) 03:31:52
設定プログラムとかで (コンソールでyとかnで答えてくやつ ENTERなしでプログラムが入力を認識してるものがあるのですが rubyで同等の機能を実現するにはどうすればよいでしょうか?
560 :
549 :2007/10/08(月) 09:25:53
色々試して見たところ 画像だけでなくファイルをrequireなどで呼び出すこともできませんでした
そうですか では色々試してください
>>560 カレントディレクトリに画像ファイルとか置いても同じ?
残念ながらMacがないので、試しようがないけど。
もし、ダメならrsdlとやらがダメだとしか・・・
なんでその場しのぎの対処ばっかで設定を表示させようとしないんだ
例外のスタックトレースが... 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 情報ありがとうございますー
現状だとできなさそうですね…
アドバイス願います。 これまでJavaメインでC#,Perlなどをやってきましたが、Rubyも触ってみようと思いまして入門書を探しております。 Amazonあたりで検索してみると、「たのしいRuby」と「 Rubyプログラミング入門」あたりが良さそうですが、出版がやや古いのが気になりました。 それなりに最新版に対応したオススメの書籍はあるでしょうか?
>>568 2版見つけましたorz
とりあえずこれを購入しておきます
>>569 ある程度はWebで見ているんですが、通勤中や朝のドトールで読めるように紙媒体で1つ入門書は欲しい所なんです
教えていただいたサイトは参考にさせてもらいます。
>>570 通勤中だとつらそうだ。Rubyの本て数少ないせいかデカいか分厚いのどっちかだもんな。
2冊バッグにいれた日にはもう拷問よw
技評のポケットリファレンスみたいなの出ないかなぁ。
>>571 大丈夫。
プログラミング言語Java(700頁弱)を満員電車で読んだからw
「たのしいRuby」は自分も電車で読んでて手が痛くなったよ サイズは小さいけど、微妙に分厚いw
初心者スレとおもったけど高度すぎ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"の違いもわからないし…。 ご教示いただければ助かります。よろしくお願いします。
>>575 RUBYOPTがどうとかどこにかいてあるんだ。。
せめてそのページのURLくらい貼ってよ
577 :
575 :2007/10/08(月) 23:36:44
>>577 多分、そのまま-rubygemsでいいと思う。
RUBYOPTはrubyに渡すオプションみたいなものだから。
そのページが間違えてるんじゃないかな?
万が一、この先つまづいたら、もう一度スレで質問するといいかも
(漏れは今日はもう寝るけど)
579 :
575 :2007/10/08(月) 23:56:34
>>578 なるほど!ありがとうございました!
>RUBYOPTはrubyに渡すオプションみたいなものだから
CUIでオプションつきコマンドを実行するときって、確かに
command -option ってなりますね。
安心して勉強できます。本当にたすかりました。
>>575 > で、連載には、システム環境変数"RUBYOPT" の値は "rubygems rubygems "と
同じのが二つあるほうが変。
アンインストールと再インストールを繰り返したりしたのかも。
> あるんですけど、私のところでは "-rubygems"。
普通はそれでいい。
n = (1..5).inject{ |m, x| m * x } puts n 120 n = (1..5).inject{ |m, x| m + x } puts n 15 初期値を与えなくていいのはなぜですか?
>>581 irb> ['a','b','c'].inject{|r,i| r << i}
"abc"
マニュアルより
> inject([init]) {|result, item| ... }
…
> 初期値 init を省略した場合は、最初に先頭の要素と 2 番目の要素をブロックに渡します。
>>582 見落してましたorz
てっきり0で初期化されるものとばかり…
これに頼った書き方をするのはあまり素性よくなさそうだ selfの先頭要素になにか特別なものが入ってるとかならいいんだろうけどさ > [arr=Array.new, 1,2,3].inject{|a,e| a.push(e)} > p arr [1, 2, 3] 面白い使い方が思いつきそうで思いつかない
重いから本を章ごとにぶっちぎって製本しなおしてるのは俺くらいか・・・
586 :
デフォルトの名無しさん :2007/10/09(火) 17:14:58
ブロック内からレシーバのメソッドにアクセスするにはどうすればよいでしょうか 残念ながら下記のself.sizeはエラーです [1, 2, 3, 4, 5].each do |v| p "%d %d" % [v, self.size] end
(a=[1, 2, 3, 4, 5]).each do |v| p "%d %d" % [v, a.size] end a が残るのが難点だが 表示させるたびにわざわざ配列作ってるような奴はそんなこと気にすんな なんかうまい方法でもあるんかね、こういうの
>>585 そうでもないような。
以前、「オブジェクト指向スクリプト言語 Ruby」をぶった切ってた人を散見した記憶が。
589 :
デフォルトの名無しさん :2007/10/09(火) 21:53:07
すみません。RDE(ver.1.1.1.1)の設定で教えて下さい。 コンソールウィンドウのフォントサイズの変更を再起動後も反映したままにする方法がわかりません。 変更はできましたが一度終了させると元サイズに戻ります。 ソースウィンドウの方は再起動後も変更が反映されますがこっちは出来ないのでしょうか? 文字が小さくて読みにくいです。よろしくお願いします。
590 :
589 :2007/10/09(火) 21:55:24
すみません、フォントサイズは解決しました。
>>586 eachブロックからレシーバのメソッドって見せないほうがいいんじゃないの?
ループの抽象化を壊してると思う。
まあ、普遍的にできりゃそれはそれで面白いけどな。 現行では、少なくとも、ブロックつきメソッドの定義時点でそのように作られてない限りアクセスできないだろうね。 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} このへんが妥当かと…
module Kernel def itap(&block) instance_eval(&block) end end [1, 2, 3, 4, 5].itap{ each{|v| p "%d %d" % [v, size] } } レシーバなくせたけど超危険。
というか "%d %d" % [v, self.size] わざわざ % 記法をこんなとこで使ってる時点でなんというか怪しい
未だに sprintf をついつい使ってしまう俺よりは…
記号の使い方に合理性などない
>>594 それは%記法ではなくてStringクラスのインスタンスメソッドだね
普通に使うでしょ
ふと思いついてやった。反省はしてない $ 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"
初心者スレだからどうでもいいが、経験上 print や sprintf や for を使う人は無茶なこと言ってくる割合が高い
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)」の方がいいのでしょうか?
うるう年の関係で1歳が365日になったり366日になったりするんだから 一律365.2425日で計算してたらズレが出てくるケースもあるんじゃないか?
603 :
601 :2007/10/10(水) 15:44:07
>>602 >> うるう年の関係で1歳が365日になったり366日になったりするんだから
そのために365や366ではなく365.2425で割ってるんじゃないんですか? (あれ?違う?)
うるう年にするかどうかはきちんと分けなきゃ駄目 西暦が400で割り切れるのは完全にうるう年 400年で割り切れない場合100で割り切れる年はうるう年ではない 100で割り切れないけど4で割り切れる年はうるう年 4で割り切れなければうるう年ではない どっかのライブラリで判定してた気がする
>>604 そうですか…。閏年判定は簡単に作れるでしょうが通日使用のスマートさがなくて複雑になりそうですね。
「現在年−誕生年=年齢(誕生日がまだなら-1)」の方が単純なのでそちらで作ります。
ありがとでした。
Ruby 年齢 Date でググって出てくるのじゃだめなの?
こんなのとか。 def age(date, today = Time::now) (today.strftime("%Y%m%d").to_i - date.strftime("%Y%m%d").to_i) / 10000 end
>>601 floor ではなく round を使う。
609 :
607 :2007/10/10(水) 16:33:12
と思ったけど、正解を求めているわけではないのね。スマソ。
>>606 ,
>>607 ググったヤツを試したら出来ました。
質問前に見た時はTime使ってたので1970以前使えないと思い、試してませんでした。
これだと誕生日過ぎたとか閏年も問題なく使えますね。スマートだし。
ありがとうです。
611 :
610 :2007/10/10(水) 17:04:43
ITproの元記事も読んだ記憶ありましたw
>>607 は整数変換に突っ込み食らって修正してたよ。
613 :
607 :2007/10/10(水) 19:03:18
>>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
615 :
607 :2007/10/10(水) 19:22:45
突っ込みコメント自体は削除してる?
整数変換の問題ってなんだろ?
修正版(
>>614 )はまんま「現在年−誕生年=年齢(誕生日がまだなら-1)」 ですよね
618 :
607 :2007/10/10(水) 19:34:51
>>617 なるほど。
計算結果自体は問題ないけどやり方がキモいところが突っ込まれたのかな。
まあそれはもっともな気もする。
>>618 すまん、オレも斜め読みしてた
正直、まだRuby慣れしてないから614ですらキモく感じる
620 :
575 :2007/10/10(水) 22:13:12
>>580 遅くなりましたがレスありがとうございました。
ここで聞いてよかったです。(私のように聡明ではない)初学者はチュートリアルと自分
の環境が違うと不安になるもので…。
CGI.new でフォームの名前と値を連想配列にいれてくれるなんて素晴らしい!とか
思いながら横道にそれながらも勉強を続けられています。きっとほかの言語にもこう
いう仕組みあるんでしょうが、なんかたのしいです。
自分の仕事に役立てられるまで(第一目標)はまずはがんばっていきたいです。
教えてくれた方々ありがとうございました。
俺も初心者だからか
>>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
Ruby関係ないしRubyはこれを特に制御しない いわゆるサブルーチンの出口の数の問題 「returnが1個だと流れとして誤りがないだろバカ」 ↑ ↓ 「制御構造が入れ子になって見にくいだろバカ」
begin/rescue標準装備なことから考えて「ジャンプがたくさんあっても便利ならいいじゃん」という思想だと推測 規定以外であれば別値をreturn 規定以外であれば別値をreturn 正常な値をreturn という規定外処理は if 文構造で分岐しまくるのと同じくらいRubyではフツーだと思う
和式便器の座る向きくらいどうでもいいな
値チェックなんかは def の次行から return 値 if 条件式 return 値 unless 条件式 raise 例外 if 条件式 raise 例外 unless 条件式 はよく書くなぁ
>>626 なにいってんだ、和製便器のあれは「玉隠し」なんだぞ。
和式便器って言わないか普通
いやー、でもTOTOの「和製洋式便器」には、玉隠しは無いしなぁ。
たまに駅のトイレで金隠しの上にウンコする奴いるよな?
"和製便器" に一致する日本語のページ 約 83 件中 1 - 10 件目 (0.74 秒) "和式便器" に一致する日本語のページ 約 59,400 件中 1 - 10 件目 (0.10 秒) このスレにもずいぶんとレアなマヌケが来たもんだ
>>627 後置の条件ってどうもなれない。Perlもそうだけど。
どうしても一行に書きたいときは
条件式 and 処理
って書いてる。
andに接続詞の意味を持たせるほうが気持ち悪いというかむしろ吐く このへんは育ったプログラミング環境によるんだろうな
if(条件式 && 処理) とかいうのがCでたまにあるけど、その流れかな
short circuit ってどこらへんが元祖なんだろう?
if修飾子はRubyに慣れてない人がみるとビびっくらこいてウンチもらしちゃいそうだからなぁ・・・
Perlで腐るほど使われてたので眉一つ動きませんでしたが何か そりゃ見難い場面はあるだろうが便利だと思うんだけどなー
BASICだとandの意味が&&と違ってるんじゃなかったかな。 つまり、 expr1 and expr2 だと両方評価する。expr2に副作用があると大変なことに。
>>635 つーか、行頭で処理を見た時点で処理済みというか、後から条件つけられても
「えっ?」って思う。
思考の流れを分断されるというか...
うまく説明できなくてすまん。
trueになるかどうかわからん判別式を行のはじめにいきなり提示されるほうが気持ち悪いわぼけー ↓以下しょうもないループ
if文を1行に見目良く書けないということが諸悪の根源 if( true? ){ 〜〜〜 } という書き方ができれば後置なんて流行らなかったろうに
if <cond> then <expr1> [else <expr2>] end と書けるわけだが
if 修飾子気持ちいいけどなぁ。 ループの先頭で next if ababa なんて書くのは。
end地獄こそが諸悪の根源じゃ
short circuit は昔からありそうな気はする... 実装として、か、仕様として、かは調査してみないとぼみょ〜
一行の if … then … end が見目善いかどうかは議論の余地があるな てか { } ブロックって使えなかったっけ?
定義してしまえ def ifthen(expr) yield if expr end
andはちょい変に感じるけど orと修飾子のif、unlessは英文に近い感じで読めるから使う
Rubyで自立的に動作するようなオブジェクトを作るにはどうすればいいですか? たとえばニューラルネットワークを構成するユニットのインスタンスを複数個作成し、 そのインスタンスがお互いに入出力を監視しあうようなものです。 ThreadとQueueで実現できるような雰囲気はするのですが・・・ ○:ユニット ←:入出力 ○←→○ ↑ ↑ ↓ ↓ ○←→○
質問です。 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
Ruby/SDLはRubyじゃない部分が多すぎて初心者にはなー というかgem自体がどうにも最初から劇薬って感じで好きくない まあ爺臭い僻みはどうでもいいとして、えーと、 gem_original_require で no such file to load は悪名高いエラー Ruby/SDLへのパスが通ってないか正しくインストールされてない
>>655 情報ありがとうございます、
試しにインストールじゃなく、RubyとSDLがパッケージになってて、
解凍してパスを通せば使えると言うのをc:\Ruby2に入れてみたところ、
サンプルファイルをRuby2\binまで持って行けば動くようになりました。
しかし、そこ以外だとエラーどころかRubyを認識もしない・・・、
取りあえず動くには動いたんでもうちょっと弄って見ますわ。
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
>>657 callにはブロックが渡せないのでは?
procのインスタンスにして渡すとこうなる。
pr = Proc.new {|x, p2| x.times{|i| p2.call i}}
p2 = Proc.new {|i| p i}
pr.call(3, p2)
文字列の括弧の中の値をキーにして ソートするため下記のようなコードを書きました。 v=%w(AAA(A02) BBB(A01)) p v.sort{|a,b| a=~/\((.+)\)/; t=$1; b=~/\((.+)\)/; t<=>$1 } これで一応動作しますが、sortに渡すブロックが泥臭い感じがします。 違う書き方があれば教えてください。
p v.sort_by{|a| a.delete("^0-9").to_i} 欠点:C22(A03)が2203になる
数字でソートしてるわけでもないように見える B02とA03だとA03のほうが先に来て欲しいんじゃね p v.sort_by{|a| /\(.+?\)/.match(a).to_s}
663 :
660 :2007/10/12(金) 22:41:18
sort_by なんてメソッドがあったんですね・・・勉強になりました。
キーについては、662さんのおっしゃるとおりで、
[A-Z]{3}\d{3}の形式で、辞書順にならんでほしいです。
私の例の書き方がわるかったですね。
ありがとうございました。
>>661 ,
>>662 。
>>657 > Procのinstanceをblock付でcallするにはどうすれば良いでしょう
1.9 featureだが。
pr = Proc.new {|x, &b| x.times{|i| b.call(i)}}
667 :
657 :2007/10/14(日) 09:01:08
>>658 ,666
レスありがとう.
どちらの情報もとても為になりました.
v1.9での表記の方がスッキリしますね.
移行しようかどうしようか迷う...
"a"という文字列から?aの値を得るにはどうすればいいのでしょうか
この方法をマニュアルから見つけられるかどうかが初級者脱出の境目だと思う irb> 'a'[0] 97 irb> 97.chr "a"
>>670 ありがとうございます。
まさか単純にインデックスを指定すればよかったとは・・・
to_chrとかそんな感じのメソッドばっかり探してましたorz
>>672 甘い、甘すぎる
そこにもう一つ書いているだろ。
> ?c が 1文字の String を返すようになりました
つまり
> "a"という文字列から?aの値を得るにはどうすればいいのでしょうか
という題意なのだから"a"[0]== ?aなのは1.9でも満たされるのさ。
Rubyってコード書くときに文字コードは何で書くのが一般的? SQLやXML使うの考えたらUTF8で書いとけば無難かな?
そのへんは必要な文字コードで書くべき 日本語EUCのファイルを読んで日本語の入った正規表現を扱うなら日本語EUCにしておいたほうが無難 正規表現の中の日本語部分だけEUC-JPで書いておくとか面倒で死ぬ
初心者です。(OS:winXP) Ruby(ver1.8.6)を使って、 手元のHTMLをIEで実行して、キャプチャして、保存して、縮小したいんです。 で、それをRuby On Railsでやりたいのですが、 良い方法ありますか?
ttp://dip.picolix.jp/disp5.html 自力で作ることはそりゃ不可能ではないが現状自力で作れてない以上君には無理だ
(自力で作れるような人はそういう聞き方をしない)
ということで外部キャプチャプログラムに素直に頼るのが得策
CrenaHtml2jpgなら何もせずに動くし縮小まできちんとやってくれるぞ
(動画ソフトの入ってない純粋なW2kの人はGDI+が無いと言われる可能性が高いのでどっかからパクれ)
WIN32APIでIEコンポーネントを使えば行けるだろ
可能であることと自分で作れるかどうかは別物
>>555 「使えない」ってどういう意味?
-K オプションを適切に指定していれば何の問題もなく使えてると思うんだけど?
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 のような感じで書きたい場合はどうすればいいのでしょうか
>>683 a,b,c、全て同じ処理fooってこと?
それなら
case hoge
when a,b,c
do foo
end
つかdoって何?
>>684 カンマで区切ればいいんですね。
do fooってのはRubyとは関係なくて、ただfooをする(do)ってことを表すために書きました
do は予約語なんで、例示に使うなら do_foo とかの方がベター。
688 :
682 :2007/10/16(火) 16:46:02
689 :
682 :2007/10/16(火) 16:53:13
と思ったけど、確かに使えないな。何か根本的に勘違いしていた。スマソ
ディレクトリ内のファイル一覧を配列で取得すると、"."とか".."とか親ディレクトリへのリンクも表示されちゃうんだけど これを削除するにはこんな不恰好な感じでいいの? なんか他にいい方法あるのかいな? list = Dir::entries(".") list.delete(".") list.delete("..") p list
Dir::glob("*") とか
ありがてぇありがてぇ・・・
693 :
691 :2007/10/16(火) 20:07:51
今リファレンス見て気づいたけど、 Dir[pattern] でもいいのか
インクリメントとして「n++」とメソッド定義できないのでしょうか? class Numeric def ++ self += 1 end end みたいな感じで。(上だとエラーでました)
++と--の定義はユーザーレベルではできません n+=1と素直に書いてください
質問です。 Ruby/SDLをEclipseで動かしたいんですが wikiで調べてそれらしいのがあったけど リンク切れだった(´・ω・`) どなたか、どうすればEclipseで動かせるのか 教えてもらえませんか?
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/とはマッチしないと思うんですが、どうしてマッチするのでしょうか?
>>697 それはその記述がRuby1.6のもので君の実行環境がRuby1.8だからだろ
1.8では「\Zは改行の前と文字列の末尾の両方に直感的に(Perlのように)マッチする」と変更されたから
「\n\Z」は「改行があって文字列終了」に素直にマッチする
マッチならいいけど置換が悲惨だな って\Zで置換する奴はいないか irb> str="line1\nline2\nline3\n\n" irb> puts str.gsub(/\Z/,'<br>') line1 line2 line3<br> <br>
そういうときは$で。 "line1\nline2\nline3\n\n".gsub(/$/, "<br/>") => "line1<br>\nline2<br>\nline3<br>\n<br>\n<br>"
702 :
697 :2007/10/17(水) 00:37:45
記述が古かったんですねorz ちなみに参照したのはピッケル本の第二版p281でした ありがとうございました
>>701 期待される置換後文字列は
"line1\nline2\nline3\n\n<br>"
だと思う
いや、そこに<br>つけんのってナニって感じではあるけどさ
つまり\nの場所や数にかかわらず「文字列のとにかく最後にマッチ」
いや、正規表現でそこ置換するのってどうよって感じでもあるんだけど
>>699 EclipseでRubyは正常に実行できるんですが
Ruby/SDLが動きません。
なにが必要なんでしょうか。
>>704 です
すいません、Ruby/SDLをインストールしてませんでした。
お騒がせしてしまい申し訳ないです。
インストールしたらできるようになりました。
getsやreadlinesを使って空の文字列を返させたい場合、どうすればいいのでしょうか?
エスパー発動
>>707 String#chompで末尾の改行を削除することができる
while line=gets.chomp do
break if line.empty?
p line
end
710 :
707 :2007/10/17(水) 22:56:30
標準入力からとつけるのを忘れてました。すいませんorz 他の言語だと空の文字列と偽が同じように扱われたりするので ごっちゃになってたんですが、rubyだと完全に別物なんですね。ありがとうございました
def hoge a, b, c puts a, b, c end def age x x * x end hoge age 1, age 2, age 3 これがシンタックスエラーになるのは何故なんでしょうか?
エラー理由を一般化して「この場合はここが…」とか説明するのは無駄なので
(シンタックスエラーが出なかったとしてもそれは意図どおりパースされたことを保証しないから)
>>711 メソッド呼び出しの引数には必ずカッコつけろ
irbで打つの面倒なときだけは許す
現行の実装の制限とかはひとまず置いといたとして、
>>711 みたいなのをエラーにならないようにするってできないのかなあ?
そもそも理論的に不可能? LALR(1) だから無理とかそういう感じ?
足し算とか面倒そうだな>必ずカッコつける hoge age(1), age(2), age(3) これが見た目も妥当かね これ以上減らすと「自分が意図したパース」と「Rubyが実際にしたパース」が食い違う危険性が増えると思う
+とか=とか以外はメソッド呼び出しには()つけてるなあ あと、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]
>>714 * 「文」に見える式はカッコつけない。
* それ以外の「一般的な式」に見えるならつける。
というところでどうかな。
要するに「値を使うときにはつけろ」。
>>716 そこでエラーになるのはバグっぽいが、そもそもVCのテキストモードの設計は
tell/seekとは相性が悪いからなぁ。使わないほうが無難。
def hoge x x end puts hoge 5 + hoge 5 これもエラーになるのね。 引数と演算子の優先度が同じ?になってるのはなんでなんだろ
720 :
716 :2007/10/18(木) 15:03:51
CR+LFのファイルやLFでもbinmodeなら発生しない LFのファイルだとCでもftellの値がおかしい ということでCライブラリ?の問題みたいです。><
>>719 演算子のように見えて、メソッドだったりするからなあ・・
irb> 5.+(5) 10
5 + 5 は演算子だけどね。
今適当に p (0..5).to_a ってやったら =>[0,1,2,3,4,5] って配列ができて感動した
>>723 class Fixnum
def +(other)
"Addition"
end
end
p(5 + 5) #=> "Addition"
演算子のように見えるようにしてあるだけでメソッドだったはず んで = とか && とかはメソッドではなく制御構造
727 :
デフォルトの名無しさん :2007/10/19(金) 00:34:46
普通にローカル環境で実行したスクリプトから そのPCのリモートホストが取得したいんですが、どうやればいいのでしょうか? 今はとりあえず、外部鯖に置いたcgiにアクセスして そのcgiが取得した環境変数の値を取得するという回りくどい事をやってます。
>>727 例えば NAT(IPマスカレイド) の内側のホストを想定すると、
そういう情報そのものが存在しない。
>>728 要するにムリって事でしょうか?
やはり外部にアクセスして間接的に取得するしかなさそうですね…
>>727 リモート向けのIPアドレスを自力で調べることができるならresolv.rbでOK
それがなければどうしようもない
>>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を返すようにできますか?
>>731 そりゃそーだけど、レクサが頑張った成果というか
>演算子 + が内部で .+を呼んでる
以上、一風変わったメソッド呼び出しだと思っておけば
変な再定義もしないんじゃないか。
…
>>725 上でなんも考えずに
>>731 の式実行して
coerceあぼーんしたorzバカス
>>727 リモートホストって何の事?ホスト名?IPアドレス?
require 'socket'
hostname = Socket.gethostname
ip_address = IPSocket.getaddress(hostname)
>>732 どうなっても知らんが
class NilClass
def [](i) ; return nil ; end
end
突っ込んだら負けかなと
あーHashを拡張か 無理
>>732 何のためにしたいのかは見当つかんけど、
とりあえずそんなややこしいデータ構造をHashの
入れ子だけで作るなってことだと思う。
h[:c][:x][:y] の例でいくと、 h[:c][:x] で10が返ってるから、10[:y]が評価されてる Hashの拡張云々の問題じゃない []メソッドの無いインスタンスはどうにでも出来るけど
>>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
>>733 何を言いたいのかわからんけど、
719からのスレの流れだということを考えろ。
考えたか?
で、a + b はメソッド呼び出し式か?
>>734 手元で試してみたけど、それだとリモートホスト(プロバイダ)のアドレスは返らなかった
>>739 なんという無茶スクリプトw そんなん初心者に勧めんな
ライブラリが軒並み動かなくなっても不思議じゃないぞ
Hash#[]が呼ばれるたびにメソッド再定義してるから、性能の問題もありそうだし
>>727 P2P アプリケーションソフト (Winny とか?) なんかだと、
connection 張った相手から自分の IP アドレスを教えてもらったりするのがあるね。
外部鯖の CGI から取得というのは悪くない方法だと思う。
俺の場合は NAT してるブロードバンドルータの Web UI から
網側の IP アドレスを表示するページを GET して HTML をパースして
IP アドレスを得る Ruby スクリプトを作って使ってる。
IPアドレスは/sbin/ifconfig(Win2k以降ならIPCONFIG)あたりから取得して正規表現で切り取ること (そりゃioctl駆使して生で取得してもいいけどたぶん面倒) require 'resolv' addr=`/sbin/ifconfig ppp0`.scan(/:([\d\.]+)/)[0].to_s puts Resolv.getname(addr)
>>740 a = VM::InstructionSequence.compile("1 + 2").to_a
b = VM::InstructionSequence.compile("1.+(2)").to_a
p(a == b) #=> true
いぇ〜い RDEインストールしたので今日からプログラムべんきょうするぜ おまえらまず何すれば委員かおしえろ まずどこのサイトよめばいいの メソッドとかクラスとかも意味をしらないとこからはじめるんだけど
>>746 そーなの?だってリナックはめんどいし
ウィンドウズでいちいちコマンドラインでやるのやだし
このソフトみっけてこれなら続くかなっておもったの
ありがとー
そのチュートリアルからみてくわ
確かに "a + b" という演算子はないわな とかグダグダにしてみる
moduleでインスタンス変数が使えるの変じゃね?
Mix-in で利用する場合とか、インスタンス変数にアクセスできても全然変じゃないような。
moduleの使い方にもよるかも newしないからインスタンス無いじゃん?みたいな屁理屈は支持
>>744 それは最適化の結果だろ・・・。
なんでこのバカわかんないのかな。
いいか、719からの流れをよく読んで、
でそれから a + bは、演算子式か、メソッド呼び出し式どっちか考えてみろ。
まにゅあるに「ほとんどの演算子は特別な形式のメソッド呼び出しです」ってかいてあるんだからめそっどでいいじゃん
論理的に考えることが出来ないのかお前。
>>726 >んで = とか && とかはメソッドではなく制御構造
いくらなんでもそりゃねぇよ。
>>753 お前そこ読んで、演算子式 == メソッド呼び出し式と主張してるの?
よく読めよ! 「特別な形式の」って書いてあるだろ! イコールで結べないだろ!
757 :
755 :2007/10/19(金) 20:49:42
ごめん。そんなことあった。 俺の不勉強でした。 てか、「=」と「.hoge=」って別物扱いだったんだな。
>>756 じゃあ何なんだ
メソッド呼び出しではないとして何なんだ
「特別な形式のメソッドだけどこれはメソッドではありません」とでも主張するつもりか
メソッドじゃないなら特別な形式だろうがなんだろうがメソッドとはそもそも言えんのではなかろうか
メソッドで表現された演算子です、という着地点はどうだろう というか演算子じゃないと何か困る奴がおるのか 演算子が何かに従属した存在だと宗教上の理由で受け入れ難いとか
はい
おっぱっぴー
>>758-759 やってる処理はメソッド呼び出しだが、「演算子」と「本当のメソッド呼び出し」では
文の中での評価順(読まれ方)が違う
そういうことだろう
つーかお前ら、ちゃんと
>>719 以降の流れと
>>731 読んでたか?
まぁ噛み付いてる側の発言にも問題があったとは思うけど
いちいち煽り文にするからこじれるんだよ
>>762 それは演算子というものの性質ではないと思う
>>758-759 >メソッド呼び出しではないとして何なんだ
a + bは演算子なんだよ。
残り三行、何故
>>719 からの流れを読もうとしないの?
>>759 >メソッドで表現された演算子です、という着地点はどうだろう
>719からの流れから、「メソッドで表現された演算子です」なんて着地点に到達するなんてアホだよ。
>というか演算子じゃないと何か困る奴がおるのか
何言ってるんだ。逆だろ。
「お前が演算子じゃなくメソッド呼び出しだ」と主張してるんだよ?
つまり、それは俺が聞きたいわけ。「a + b が演算子だと何か困るのか?」
もうどうでもいい。 匿名掲示板で喧嘩腰で吠えるのは不毛だからやめとけ。
なら黙ってればいいのに。どうでもいいことに口を挟むのは不毛だからやめとけ。
だから不毛とか禿げの俺がいる前で(ry
>再定義できる演算子(メソッド) >再定義できない演算子(制御構造) って公式で言ってんだから、それ以上でもそれ以下でも無いだろ。 「+」が演算子かメソッドかで言ったら 「演算子で、かつメソッド」なんだろ。 それで文句あるヤツは、ここで言ってないで公式サイトに言いに行けよ。
>>769 「最終的な結果は」そのとおり。
しかし、パースのされ方、評価の過程が違う。
そして、
>>719 は過程を問題にしてる。なんでわからないのかな。
Klass#+ ←メソッド a = Klass.new a.+(b) # ←Klass#+というメソッドの普通な呼出し a + b # ←Klass#+というメソッドの特別な呼出し じゃねーの? a.+(b) も a+b も呼出しであってメソッドではないんでね?
んで
>>719 なんだけど
式を書かなければならないところで普通のメソッド呼出しをする場合は
引数を括弧で囲まなきゃいけない、っていう話じゃないの?
優先順位とか以前に文法上誤りじゃね?
だよな 話が変な方向にこじれた
要するに、使い勝手の悪い言語なんですね。
初歩的な質問ですみません。 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
Ruby標準ではselfのオブジェクトを明示的に変換するというメソッドはあまり無いっす s= s.to_i とか書いて変換してくだしあ
結果のクラスも同じなら破壊的なメソッドは結構あるんだけど 結果のクラスが変わってしまうのはほとんど無いと思う
つーか、演算子には優先順位があるだろ。 ただのメソッド呼び出しとは決定的に違う。
779 :
775 :2007/10/19(金) 23:13:08
>>776 ,
>>777 そうなんですか。
クラスが変化する破壊的メソッドがほとんど無いというのは勉強になりました。
str.to_i.to_s.to_iでもstr自体は何も変わってないのですね
ピッケル本第二版のP294を見ると=は+よりも優先度が低いみたいなんですが それなら何故 1+x=3 という式はエラーにならないのでしょうか? (1+x) = 3 という風に解釈されると思うんですが
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だけいわゆるパブリックにしたいです
module Hoge def Hoge.nya
>>782 それだとnyaもパブリック扱いになってるじゃん
moduleはincludeしないときは使わない
無理してでもクラスとクラスメソッドにしとく
>>781 みたいなことがあってよくわかんなくて理解諦めた
自分で使うだけだし厳密にやる必要もないかなみたいな
>>781 これでどう?
def run
extend Hoge
puts nya
end
ただ、
>>784 も書いているけど
include される見込みがないのなら
module にするメリットはあまりないと思うよ。
786 :
781 :2007/10/21(日) 02:49:06
じゃあモジュールやめてクラスにしてクラスメソッドの集団にします 「インスタンスを作る理由がないからクラスじゃなくモジュールにするんだよー」という考え方は それはそれでとても一理あるとは思うんだけど
>>786 そもそもなんでnyaがパブリックではいけないんだ
本当にインスタンスを作る必要がないのか?
単にクラスメソッドからはインスタンスが必要なメソッドを呼べないだけじゃないの? モジュールをクラスに変えても、この問題はあまり解決にならないような。 private、publicにこだわるなら、こうじゃない? module Hoge def nya 'nya' end def run puts nya end module_function :run,:nya private_class_method :nya end Hoge::run
>>787 横槍だけど、まぁ、単にネームスペース的に使いたいことはある。
Rubyの作法としてそういうモジュールの使い方が
いいのか悪いのかは、良く分からない。
まあ、そんなこと言ったらプライベートメソッドとかインスタンス変数の外部からの参照とか そういうのは全通しにしておいて使うとき気をつければいいじゃん、みたいな話になり それってつまりグローバル変数であんなに困った過去忘れちゃうってこと?みたいな
はじめたばかりの素人です。 CGIをRubyで動かそうと思ってCGIファイルの 頭に#!ruby/bin/rubyを書いてみたんですが、 Rubyで動かず#!ruby/bin/rubyがそのまま表示されてしまうんですが なにがおかしいのでしょうか?
実行権限を与えてないのでは。
>>792 おそらく、それだと思います。
具体的にはどうれば良いか聞いてもいいですか?
>>794 ありがとうございます。まずそちらのサイトで調べてみます。
分からなければ、次は詳細を付記してまた質問させていただきます。
796 :
780 :2007/10/21(日) 12:14:39
誰か
>>780 もお願いしますorz
それともこういう質問はruby-listで聞いたほうがいいんでしょうか?
>>796 たしかに仕様に関することはruby-listで聞いた方が返事がはやいかも。
xはメソッドである+の引数だからじゃないの? とP293を読んで思った。
1.+(x=3) #=>4
「処理なメソッドをまとめた」だけのクラスメソッドだけのクラス作るとき runメソッドを作ってて「ここ nya メソッドにして括り出そう」と思ったら def Hoge.nya と書かないとダメっぽいのがとてもイヤ(いや、他の方法もあるけどさ) や、普通に def nya って書いたらインスタンスメソッドで クラスメソッド使うぶんにはインスタンスが無いから動かないんだよね 理屈はなんとなくわかるけど、でも書くのちょう面倒
def self.nya じゃだめなぬか? #他の方法とはこのこと?
>>800 モジュール関数(module_function)にすれば書く必要なくなるよ
わりとどーでもいいことなんですが $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で捕捉して一律無視するのは開発中はちょっと怖いです
ruby 特定の例外を捕捉 でググル
>> 800 class Hoge end class << Hoge def run nya end def nya end end という書き方はどうでしょう。
>>799 演算子の順位が + > = なんだから
1+x
のほうが先に評価されるはずじゃね?
と789が申しておりマス
256倍本の無道編P58のスキャナで、文字列を取りだすために使われている 正規表現 /\A"(?:[^"\\]+|\\.)*"/ について質問なんですが、後半の|\\.はどういう意味なんでしょうか?
または、円記号そのものに続けて任意の一文字 典型例としては "abc\ndef" みたいなのを念頭に置けばいいんじゃまいか
>>806 代入について
左辺値がオブジェクト属性の場合は、対応する属性設定メソッドが右辺値を引数として
レシーバ内で呼び出されます。
(ピッケル本P293)
x<y<z とか 4<x<6 のような式をかけないのはどんな理由からなんでしょうか?
>>810 X=5の場合
4<x<6 → (4<x)<6 → true<6 → エラー
だからじゃね?
+ よりも優先度が低い<<の場合は 1 + 3 << 2 でちゃんと1+3のほうが先に計算されるね
「そういうふうに作ってないから」以上のなにものでもないなw というか三項比較が式としてそのへんに書ける言語って少なくね?
書ける言語ってどんなのがあるの?
irb> (4 .. 6) === 5 true irb> a=4.1; b=6.2 irb> (a .. b) === 5.5 true Rubyでは範囲オブジェクトを使ったり使わなかったりする
pythonは書ける
>>809 それは回答になってなくね?その説明は演算子の順位とはまったく絡まない話ではないかい?
>>817 演算子の順位以前の文の評価レベルの話だといことではあるまいか
"abc"+x="def" #=> "abcdef"
"abc".+ x="def" #=> "abcdef"
1+x=3 #=> 4
1.+ x=3 #=> 4
>>780 マニュアルのBNF風文法から
EXPR : MLHS `=' MRHS
たぶんこれが代入。MLHSは還元していくと
LHS : VARNAME
| PRIMARY `[' [ARGS] `]'
| PRIMARY `.' identifier
のリストに落ち着く。
1+x=3は1+xが左辺値じゃないので字句解析の段階で明らかに
1+(x=3)だとわかる…からだと思う。自信なし。
1+x=3
左から評価してくと
+は1(Fixnumオブジェクト)のメソッドである
xは+メソッドの引数である
>>809 から
xの右に=があるので+メソッドは=の右辺値の3を引数として呼び出す
となるのではないでしょうか?自信なし。
初期化時以外で hash[1] = "a" hash[2] = "b" hash[3] = "c" みたいな処理を短くスパっとやる方法はないでしょうか?
>>819 字句解析の段階でそんなことがわかるはずがない。
>>821 右結合か左結合か、そんなの関係ない。
右結合か左結合かは同じ優先順位の演算子の場合にしか意味が無いから。
>>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) となる。
>>818 >演算子の順位以前の文の評価レベルの話だといことではあるまいか
ちがうんじゃね?
評価は構文解析が終わったあとにしかできない。
そして構文解析をするときに演算子の順位が必要。
それから「代入式の左辺がオブジェクトの属性の場合...」うんぬんの話も、
構文解析のあとの意味解析での話。
だからこれも構文解析には関係ない。
構文解析では 1 + x = 3 を (1 + x) = 3 なのか 1 + (x = 3) なのかを演算子の順位をもとに決めるだけ。
オブジェクトの属性かどうかなんてこの段階ではわからない。
だから '+' > '=' のはずなのに 1 + (x = 3) と構文解析されるのならおかしいと思う。
>>825 なるほど!
といいたいことろだが、さっぱりわからん。
この説明でみんなわかるのだろうか。。。自身なくなった
>>823 >>828 >>822 の説明が微妙に足らんのだな
ハッシュを直に書いていいのなら
>>828 がオブジェクトも変わらず便利
キーや値が配列か何かに格納されてるのならマニュアルにあるみたいなのしかないな
>>827 代入は 「左辺 = 引数」 という形でしか、構文木が作られないの。
そして、+演算子の式は 「引数」であって「左辺」ではないの。
+の方が優先順位が高いんだけど、そもそも「BNFの定義」的に、
((1 + x) = 10) というパースはありえなく、そういう構文木が作られることもないんだよ。
一方、 x = 10 は 「引数」になることが出来るんだ。
だから、 (1 + (x = 10)) というパースは可能で、構文木も作ることが出来るんだ。
エラーになる言語の場合、 ((1 + x) = 10) で構文木が作られちゃって、
その後の意味解析で弾いてるからなんだね。
832 :
822 :2007/10/22(月) 00:10:21
すいません説明不足でした。orz 初期化以外でと書いたのは hash[1] = "a" hash[2] = "b" hash[3] = "c" の前に hash["hoge"] = 30 hash["age"] = [1,2] のように、その前にいくつかのキーと値がセットされている状態で、ってことです。 replaceだとこれらが消えちゃうみたいなのでやっぱり一行ずつ書くしかないですね。
>>832 mergeでなんとかなる話?
hash.merge!({1=>"a", 2=>"b", 3=>"c"})
834 :
822 :2007/10/22(月) 00:18:43
それにしてもHashの初期化は、他のオブジェクトと比べて書くの面倒だ 早く1.9で簡易記法採用されないかなぁ
Rubyとはあんまり関係なさそうなんですが &&と||の優先順位が異なるのは何故なんでしょうか?
>>836 そりゃ集合論の話で、仮に優先順位が同じなら
どんあ不都合があるかを考えれば分かる
>>833 > merge!
わかりにくいのでハッシュの追加はupdateと書くように
>>839 > その{と}はいらない
ハッシュにハッシュだから書いたほうがよいと思う。
省略するほうが却って意味がわかりにくい。ブロックを渡してるように見える場面でもないし。
何が何でもキーワード引数ごっこでオナニーするのはやめとけ。
>>831 丁寧な説明ありがとう。「引数」といわれるから分かんなかった。
「引数」を「式」だとすると、
* 通常の2項演算子はBNFで「式 : 式 '+' 式」とか「式 : 式 '*' 式」と定義される。
* しかし代入式は「代入式 : 左辺値 '=' 式」と定義される。
* そのため、「1 + x = 10」は演算子の優先順位がでてくることもなく「1 + (x = 10)」と解析される。
* もし代入式が「代入式 : 式 '=' 式」と定義されていたら、「1 + x = 10」は演算子の優先順位により「(1+x) = 10」と解釈される。
なるほどー、これですっきりした。説明さんくす。
個人的にはRuby方式はやだなー。「1+x=10」が意味解析でエラーになってほしいわ。
厳密なのが大好きな人はOCaml等を使ってください。 それっぽく書けばそれっぽく出来るのがRubyのいいところ。w
nilとfalseの違いってなんなんでしょうか?
>>842 「それっぽく書く」にも限度があるし
そもそも式の意味通りの動きが出来てないじゃねーか
1+x=10と入力したらx=10になってるんだから
>>843 俺の理解では
falseはtrueと合わせて真偽値の偽、つまり「間違ってる」とか「失敗した結果」を表す
対してnilは「無いこと」を表す。0や空文字列みたいなもの
スクリプト上での動作にはあんまり差はない
> スクリプト上での動作にはあんまり差はない いや、けっこう差はあるだろ ただ、おそらくは一番利用されるであろう 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」は何を表している?
>>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 が表示している
>>846 nilはputsの返り値でしょ。
a = puts 3+4 # => 7
p a # => nil
イメージ的にはこんな感じ?
def puts(str)
print "#{str}\n"
return nil
end
CやJavaでいうvoid型じゃないの?
> CやJavaでいうvoid型じゃないの? 激しく違う 関数(メソッド)に対する void は「引数を取らないor値を返さない」 という宣言で、void型の値、というものは存在しないし、 C の void * は、ワイルドカードなポインタ型、という位置付けで、 Java の Object みたいな物で、この void はどんな型でも、という 宣言のようなもの。
850 :
346 :2007/10/22(月) 15:03:24
>>847 ,848
それで,結局「=>」は何を意味したプロンプトなんですか?
853 :
346 :2007/10/22(月) 15:30:15
854 :
848 :2007/10/22(月) 15:49:48
>>849 書き方悪くてスマン
void型というよりvoid型の代わりというべきだったか?
Rubyのメソッドはreturnなくても最後の式の値を返すから、
値を返さないという意味でnilを返してる、のつもりだったのだがまだ違うかな
リファレンスマニュアルみると
>>最後の式が(whileなど)値を返さない式の場合は nil を返します。
なってた
>>854 意図して明示的に nil を返す場合もあるわけで、
void 型 (の代わり) と言ってしまうのは例え話としても乱暴すぎる気がします。
てか、普通に「NULL みたいなもの」でいいような。
>>855 意図して明示的にnil返す、のはもちろん含んでません
void型と書いたのはputsみたいに戻り値が(多分)不要なのに最後の値を勝手に返さないようにする意味でnil返すのでは、と言いたかっただけなのです。
でも何か気持ち悪い?
if puts(3+4) == true
puts "puts成功"
else
puts "puts失敗"
end
結果
7
puts失敗
たとえ話の正確性でもめんなw
858 :
デフォルトの名無しさん :2007/10/22(月) 17:34:26
変数名とメソッド名は全部小文字でアンダーバー区切りですよね camelCaseなんて使いませんよね
やだ・・・あたしは使っちゃう・・・
cmd_OpenFile cmd_CLoseFile とかはやっちゃう おれっち的には超COOLな感じなんだけどだめかな
cmdナントカ(笑)
>>862 確かに凍りつくくらい超COOLだ
cmd_Open_Fileとかごっちゃになって間違わない?
Rubyでインテリセンスが出来るソフトはありますか?
>>865 NetBeansがインテリセンス出たよ
>>859 Ruby/SDLなんかのAPIを見ると、camelCase派もいるのかもしれない
だが
>>862 は理解不能だ
CGI.escapeHTML
>>868 それはCGIとHTMLがいわば固有名詞だからだ
せめてCgi.escapeHtmlになったときに持って来い
あと普通に通常に使用するメソッド名にcmdとかつけるのは
変数にarr_hogehogeとかデータ形式表すプレフィクスつけるのと同レベルで禁止な
open_xxxfileとかxxxfileとかでいいじゃん
じゃあ恥ずかしいから全部メソッド名書き換える!
>>868 escapeHTMLもはっきり言ってダサい
他のメソッド(CGI含む)に大文字が入ってないのに、なんでこれだけ大文字になってるのかと
俺は以前CGIスクリプト書くとき、最初の方で必ずescape_htmlを定義してた
cgi.rbの置き換えはいつ行われるのだろうか……
>>871 > cgi.rbの置き換えはいつ行われるのだろうか……
たまには webrick/cgi のことも思い出してください。
思い出して欲しけりゃ適度にわかりやすいマニュアルとcgi互換の解説を書くんだな
>>872 使いやすいのは間違いないけど、マニュアルの少なさ以前に
あれcgi.rbと比べて異様に知名度が低いんだ
俺は4年目でようやくwebrickの存在を知った(るびまのおかげで)
いっそのことcgi.rbをobsoleteにして
webrick/cgiをRubyでの標準扱いにしてくれたらいいのに、と思う
うぇーびっくり
webrickはプロクシの作成方法しか無いぞぶっちゃけ
定数のアクセスが::なのはどうしてなんでしょうか?
>>877 「どうしてクラスやモジュールを呼び出す文法といっしょなんでしょうか?」という疑問なら
「クラスやモジュールはRubyでは定数と一緒だから定数と同じアクセス方法を用いる」という答になるかと
なんでコロンを2つ繋げた記法なんですかという疑問なら「うっせー文句言わず使え」とかそんな答
>>874 webrick/sessionがないと移行できないよ。
Ruby関係ないしレス書いてる途中でどうでもよくなってきたので悩まず答えてくれるといいんだけど [{title=>タイトル, author=>著者, category=>カテゴリ番号}, ...] という書籍データがハッシュで大量に格納されてる配列arrがあって カテゴリ番号配列.each do |category| bookdata = arr.find_all{|e| e['category'] = category} … end という感じで「カテゴリ番号に一致する書籍のハッシュ」を抜き出したんだ bookdataってとこの変数名を何にしたらわかりやすいかな? 「マッチするデータを抜き出したもの」のいい名前ってどうにも思いつかない 毎回変な名前になって「これ何だっけ?」とか読み返したとき悩む
match category_match
catogolizeddata
あ、lとr間違えた orz
>>880 どうでもいいならそんなゴミ書き込まなきゃいいだろ・・・
つかコメントをちゃんと入れておけば解決する
matched_list
founds
matched_books
ブロックが短いなら素直にlistとかdataとかでいいと思うよ
>>884 コメントを入れれば何でも読みやすくなると思うな
名前は超重要だぞ
>>883 oとeも間違えてるよw
cat"o"golizeddata
コメントつけた場所のずっと後ろで使う場合もあるからな
ていうか「コメントつければわかる」ってめちゃくちゃ思考停止じゃないか 何のために変数名にアルファベットとアンダースコアの長大な文字列を許してるんだよ つけられた名前を見ただけでメソッドの動作や変数の内容がわかるってのが本義だろ わかりやすい名前はコメント以上の価値がある
matchは正規表現のマッチと紛らわしいな String#scanを使わないのにscanned_dataって書くのと似たような息苦しさを感じる ということでpickedという形容詞はどうだろう
>>888 俺もそう思う。
変数名とかメソッド名だけで分かるのが理想。
そうやって名前に気を使うと覚えやすくなるし。
891 :
884 :2007/10/23(火) 04:14:39
>>888 思考停止っすかw
長大な変数名ばかりのコード読めば判ると思うよ
まぁそういう変数名使う人間は大概コメントすら書けないんだけどね・・・
短くて判りやすい名前を使いたい! ↓ かぶる ↓ 処理をこまめにメソッドに分ける ↓ コメントがいるほど読みにくくないし、ユニットテストもできる ↓ ウマー
893 :
884 :2007/10/23(火) 05:16:19
>>892 >>887 読めば判るでしょ、そもそも普通に書いてれば
>>880 で「これ何だっけ?」ってならないし・・・
BetterPerlって言われる意味がよくわかったわ
思考停止だと思うぞ
「ちょうどよい」の探求を放棄してるんだものね
「昔のPerlの書き方」から本当に抜け出せてないのは
>>893 のほうかも
「○○して××を△△した配列とアレの配列を合わせた配列ただしゼロは入ってない」をローマ字で入力したような変数名を見たとしても だからといって意味付けされた変数名の使用を止める気はない 変なユーザーがいるからといってRuby使用を止めない程度には
897 :
884 :2007/10/23(火) 19:41:27
>>891 で、その「長大な変数名」とやらはどんな名前だったんだ
>>893 「これ何だっけ?」となるのは、たいてい変数名が端的過ぎる場合
長くて適切な名前つけてれば後で読んでも意味が通る
なんか鯉のぼりみたいだな
クラス設計をきちんとすれば変数なんてトリビアルなものしかいらないからi,j,kで十分
長大な変数名は使わないけど変数名には気を使うよ
メンバ変数とかなら気を使うけど、ただの作業用の変数だと適当に list_aとかlist_bとか、平気で使っちゃう。。。
foo bar hoge orz 辺りは普通に使うよね?
>>903 orzはないだろw
でも代入が面白そうだ >> orz = 〜
今度使ってみよっ
それはなー、代入じゃなくて挿に(以下自粛
orz=3
Ruby認定試験対策問題 by NaCl
http://projects.netlab.jp/ruby-test/ > これら問題が全く的外れだったとしても責任は持てません。ご了承ください。
> 10月26日 18:30から松江オープンソースラボ(松江テルサ別館2階)で開かれる 第15回オープンソースサロンでは,
> これら模擬試験問題から以下の問題のうち,赤枠でピックアップしたものを解説します。
> 解答は10月26日までに公開する予定です。
if(hoge) return true end のような式を抽象化したいのですが、関数にしても結局呼び出し元で返り値を チェックしてreturnする必要があります。 Cのマクロのように、条件によってreturnするしないを一行にまとめる方法はないでしょうか?
return true if hoge
>>907 言語仕様がないんだから実行結果に関する問題が出せるわけがないwww
912 :
デフォルトの名無しさん :2007/10/24(水) 18:13:34
>>907 2ちゃんねらの総力をあげて解答UPしようぜ!!!
Rubyの勉強がてらにWebアプリを作りたいと考えてます。 WebサーバはApacheとlighttpdのどちらがいいでしょうか? 早い段階でRailsも試したい&無料レンタルサーバで動かしたいとも考えています。 Rubyの他、PHPも使います。(OSはFedora7) 外部のサーバはApacheが多いと思うので家でもApacheの方がいいのでしょうか? あとサーバによってソースを修正する必要はないですよね?
>>907 さっと見たけど、なんつーか・・・
下の問題で解が出てるとか試験になってないな
>>907 「1.1.実行方法」って、こんなの Ruby の問題じゃないじゃん。
シェルの実装によっては選択肢に正解が無い可能性もある。(事実上無いとは思うけど)
事実上なければ問題ない。 Rubyそのものがそういうものなんだし。
>>913 無料レンタルサーバを前提に考えるなら、Apache一択だが
そもそもどのサーバでも大差ないとは思う。基本は同じだから
あとWEBrickという選択肢もある
>>907 正直、バージョンの違いによる差も考えてなければプラットフォームの違いによる差も考えてないというあたりで役に立たない予想問題だった。
もっとも、実際の試験問題もこんなレベルなのかもしれん
バージョンやプラットフォームの違いに関する知識なんて問うてどうする オタク向けカルトクイズじゃねえんだぞ いや1回目は似たようなもんかもしれんが
>>920 バージョンやプラットフォームの違いに関する知識が問われてるんじゃなくて、バージョンやプラットフォームが違ったら結果が違うようなことを問われてるんだってば。
つまり正解が一つに決まらなかったり選択肢に正解がなかったりするということ
叩くのは解答が出てからでも遅くないだろ
rubyから帳票を印刷したいです。osはw2kです。 文字を印刷するだけでいいんだけですが、どうやれば 印刷できますか?
system("notepad /p #{filepath}") 印刷用の外部プログラムを起動させるのが素直
通常は if (hoge==10) do_foo end のような処理をして、変数xがtrueのときだけ if (hoge==10) && (age==20) do_foo end と動作するようにしたい場合はどのように書けばいいのでしょうか?
if x do_foo if (hoge==10) && (age==20) else do_foo if (hoge==10) end そのまんまだけどw でもどちらもdo_fooだから結果は同じ?
t = (hoge == 10) t &= (age == 20) if x do_foo if t とか do_foo if(x ? (hoge==10) && (age==20) : (hoge == 10)) とか? 一次変数増えるけどDRYに従って個人的な好みは上。
>>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
930 :
926 :2007/10/25(木) 01:15:18
参考になります。ありがとうございました。 実際にはdo_fooは10行ほどのコードなんですが これらをbegin,endで囲んでifを後置きするようにすればいいんでしょうか?
ちょ。begin って! Algol 系の begin と Ruby の begin は超別物
テキストファイルなどを後ろから1行ずつ読みたいんですけど、 IO.readlines("hoge.txt").reverse.each { |t| p t } こんなのより良い書き方ってありますか?
後ろから1行ずつ「処理」したいんならそれでいいと思う どうしても後ろから読みたい、ってことじゃない、よね?
>>880 は説明のために「日本語のような変数」で書いてるだけだろ。擬似コードみたいな。
いちいち「xxxは○○な変数で…」とか説明するの面倒じゃん。
いや、もしかしたら日本語変数な人かも知れんけど。
>>926 「xがtrueでなくhogeが10のとき」か「xがtrueでhogeが10でageが20のとき」に真
これを踏まえて自分がわかりやすいように素直に記述
>>932 IO.readlines("hoge.txt").reverse_each{ |t|
p t
}
937 :
デフォルトの名無しさん :2007/10/25(木) 10:41:41
>>932 File.open('tail -1 -f hoge.txt |').each { |t|
p t
}
あー
943 :
940 :2007/10/25(木) 14:18:24
>>941 open('logo.gif', 'w+b')
できました!ありがとうございます。
944 :
940 :2007/10/25(木) 14:18:59
組み合わせ技の例とか無いんだよね、マニュアル
# 教科書的
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でいいんじゃね? みたいな
>>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
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メソッドの引数になにを入れていいのかわかりません。
どなたか、ご存知の方いますでしょうか?
ruby -e 'require "net/http"; Net::HTTP.get_print("www.google.co.jp", "/intl/ja_jp/images/logo.gif")' > logo.gif
ボタンが複数あろうと、普通押すのは1つじゃないか? たぶんaction属性書き換えたらいい気がする
>>949 submit(form, button=nil)
次のようなコードを書いたら syntax error, unexpected kIF_MOD, expecting kTHEN or ':' or '\n' or ';' とエラーが出てしまったんですが、どうしたら動くようになるのでしょうか? if 1 puts 10 if 1 elsif puts 2 if 1 end
956 :
949 :2007/10/25(木) 16:34:22
>>951 はい、そうなのですが、どのsubmitボタンか…というのを限定する方法が
submit(???)で出来るらしいのですが、なにを入れたらよいのか、わからないのです。
>>952 ご返答ありがとうございます。
submit(form, button=nil)
の2つ目の引数の button=nil になにが入るのかわかりますでしょうか?
submit の nameなのか value なのか どちらも違うのか…
なんども質問すみません。
958 :
949 :2007/10/25(木) 16:37:17
>>953 返答ありがとうございます。
サイトをみたのですが、 subimt()のところがどうなっているのかよくわからないのです
961 :
949 :2007/10/25(木) 16:58:26
>>960 おおおっ!!!
ありがとうございます!!
3日悩んでたのですが、解決しませんでした!!
感謝です!!
リファレンスも見ないでどうやって悩んでたんだ?
むしろわざわざマニュアルわかりにくいWWW::Mechanizeでなければならん理由がわからん
じゃあこの手のことやるのに何がお勧めなのよ。
class Hoge def foo .... 上のようにクラス定義の中でdefを使った場合、メソッドはHogeオブジェクトの中に 定義されるのに class Hoge def foo def bar ... end end end obj = Hoge.new obj.foo とやってもnewで生成されたオブジェクトの中ではなく、Hogeオブジェクトの中に メソッドが定義されてしまうのは何故なんでしょうか?
>>965 記述方法が違うから?スコープの問題?正直よくわかんね
でもインスタンスにメソッドを定義する時(特異メソッド)はこう書く
class Hoge
def foo
def self.bar
puts 'bar'
end
end
end
Hogeクラス内に含まれる「def bar」は、 そのコードを実行したときにHogeクラスにメソッドbarを追加する、 って文法だからじゃね? 「def foo」は最初に実行されてる。 俺流解釈だから、間違えてるかも。 誰かフォローよろ ・サンプル ↓だけのスクリプトを実行するとだと1が表示される。 class Hoge p 1 def foo p 2 def bar p 3 end end end
マニュアル読もうぜ。全部書いてある。
>>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
activerubyインスコしてコマンドプロンプトで c:\Documents and setting\user>ruby -v と打っても ’ruby’は内部コマンドまたは外部コマンド、操作可能なプログラムまたは バッチファイルとして認識されていません。 とでて始めることができません ソースをを窓にぶち込むと動いてくれたんですが この状態だとライブラリがうまく使えないみたいなので困っています
>>969 >ソースをを窓にぶち込むと動いてくれたんですが
意味わからん。
その「コマンドプロンプト」をどうやって開いたのか知らんが、
スタートメニューから辿ってActiveScriptRubyグループの中に
ある奴を使ってくれ。
>>970 ありがとうございます ruby consoleから入力したらライブラリ読み込んでくれました。
アクセサリのコマンドプロンプト使って
テキストエディタで作った拡張子 rb
ファイルドロップして動かしていました。
973 :
969 :2007/10/26(金) 19:39:07
>>972 ありがとうございます
今度はbmp取り込みエラーが出て困ってましたが
これして本に書いてるとおりライブラリ読み込んで動作するようになりました。
rubyの前に日本語を勉強したほうがいいと思った
すみません、ちょっと初心者の質問させてください。
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
}
ん? Basic認証は半自動で行われるいわゆるアクセス許可であって、アプリケーションのログインに当たるものじゃないよ? そのディレクトリにアクセスできるかどうかを許可してるだけ basic_auth を指定しない(あるいは間違ったユーザー名とパスワードをの)アクセスで 401 Authorization Required が返ってくればBasic認証領域だってことだけど、それ以外で認識する方法はないと思う (認証が成功したときに返ってくるHTTPヘッダには認証のことについては普通は何も書いてないはず)
>>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'} みたいな感じのメソッドがあれば。 一つ一つイテレータで作り出すしかないのでしょうか?
inspect
p x がやってるのは $stdout.puts x.inspect と同じ。
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でエラーを出なくするにはどうしたらいいんでしょうか?
extend 'Math' 影響範囲は大きいので数学っぽいメソッドを自前で定義するときは注意
越後「クリアリングが甘いぞハルミ!」
984 :
981 :2007/10/27(土) 20:11:55
>>982 いけました。ありがとうございます。
名前がぶつかる問題は今のところはなさそうです。
スクリプト
DMDスレの誤爆か
ハルミスレです><
988 :
978 :2007/10/28(日) 10:06:28
>>980 細かいこというと直接write使ってるっぽいよ。
IO#putsとかIO#printとか再定義してもそのままだったし。
というかそれこそマニュアル嫁って感じだな IOにある表示のメソッドはwriteを直接呼んでることになってる printやputsを流用してるメソッドは無い 著名なモジュールや自作のクラスでもwriteを使うってのは気の遣い過ぎだが ただ、ファイルに書き出すときはio.printだとピンと来ないのでio.writeと書いてる俺
>>990 Rubyにマニュアルなんてあったかなwww
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 そろそろスレ消えるんで申し訳ないすけどたのんます!
hash = {} str.split(//).each do |c| if hash[c].nil? hash[c] = 1 else hash[c] += 1 end end p hash
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 ってたいして変わらんな
あー、Windowsならsplit(//s)か。 とにかく、分割したアルファベット自体をキーとするハッシュに登録して数えるのが真っ当かと。
1000 :
デフォルトの名無しさん :2007/10/31(水) 19:13:51
ありがとうございます!!! 超ありがたいです!! ほんますいませんしたぁぁあ!!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。