Ruby初學者スレッド Part 9
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001紅寶石
2006/11/21(火) 08:33:42マニュアル
http://www.ruby-lang.org/ja/man/
Ruby FAQ
http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
逆引きRuby
http://www.namaraii.com/rubytips/
Ruby リファレンスマニュアルの Windows HTML Help版
http://elbereth-hp.hp.infoseek.co.jp/ruby.html
Rubyリファレンスマニュアル刷新計画
http://doc.loveruby.net/
前スレ
Ruby初心者スレッドPart8
http://pc8.2ch.net/test/read.cgi/tech/1159424939/
>>2-10
0809デフォルトの名無しさん
2007/01/10(水) 21:37:59馬鹿だなお前
0810デフォルトの名無しさん
2007/01/10(水) 21:42:18shebangの解釈はexecve(2)が行う。
これまでシェルが頑張ってるとでも思っていたのか。
0811デフォルトの名無しさん
2007/01/10(水) 21:47:300812デフォルトの名無しさん
2007/01/10(水) 21:51:030813デフォルトの名無しさん
2007/01/10(水) 22:35:48歳が判るような判りにくいネタを・・・ww
0814デフォルトの名無しさん
2007/01/10(水) 23:48:59#!/bin/sh
↑こういう行で何か思うところはないかね
0815デフォルトの名無しさん
2007/01/10(水) 23:59:05808じゃないが、>810を知る前は
単純にシェルがshを起動してるんだと思ってましたorz ハイアホデス
0816デフォルトの名無しさん
2007/01/11(木) 00:05:02どうみても#!の行はshellが解釈してるだろ
本当にありが(r
0817デフォルトの名無しさん
2007/01/11(木) 00:07:05ttp://www.linux.or.jp/JM/html/LDP_man-pages/man2/execve.2.html
0818デフォルトの名無しさん
2007/01/11(木) 00:27:231. 入力を、変数展開とかクォート処理ののちトークンに分割。
2. 環境変数PATHの要素のディレクトリそれぞれについて
一覧を見て、第1トークンに一致する実行ビットの立っているなものを探す。
3. 見つかったらそいつに残りトークンを添えてexec(2)系システムコールを発行してwait。
見つからなければCommand not found.
あとはカーネルの仕事。
0819デフォルトの名無しさん
2007/01/11(木) 03:01:260820デフォルトの名無しさん
2007/01/11(木) 03:16:51パイプとか
リダイレクトとか
ヒストリーとか
他には?
0821デフォルトの名無しさん
2007/01/11(木) 03:29:21一所懸命皮肉を言おうとして、全部失敗してるもんな。
0822デフォルトの名無しさん
2007/01/11(木) 07:07:440823デフォルトの名無しさん
2007/01/11(木) 08:38:41そりゃほかにも、変数の展開とか、ifなどの制御とかはあるだろうよ。
0824デフォルトの名無しさん
2007/01/11(木) 09:28:230825デフォルトの名無しさん
2007/01/11(木) 10:58:44ほっといてやれ。
0826デフォルトの名無しさん
2007/01/11(木) 19:56:13ブラウザー操作をしています。
JapaScriptポップアップが出現したら消すよう制御したいのですが
可能でしょうか?
できればWIN32OLEでの実現法を知りたいです。
宜しくお願いします。
0827デフォルトの名無しさん
2007/01/11(木) 21:23:54まじめに考えると、
自分でそういうポップアップ「だけ」出るページを作って実験するのがいいと思う。
irbからでも操作できるので実験するのがいいよ。
0828デフォルトの名無しさん
2007/01/11(木) 21:30:260829デフォルトの名無しさん
2007/01/11(木) 22:30:47↓
「コンポーネントの追加と削除」
↓
「スクリプトデバッガ」をアンインストール
0830826
2007/01/12(金) 13:52:49ブログを巡回して自作ブログ検索エンジンを作成しているのですが、
やはり net/httpだとJavaScript周りの値が拾えなくて困っています。
0831デフォルトの名無しさん
2007/01/12(金) 13:58:49ここで聞いてみたら?
http://pc10.2ch.net/test/read.cgi/tech/1166172047/
あと2chもうすぐとまっちゃうみたいなのでお早めに
0832デフォルトの名無しさん
2007/01/12(金) 20:16:21>>831
2ch止まるの?
0833デフォルトの名無しさん
2007/01/12(金) 20:18:370834デフォルトの名無しさん
2007/01/12(金) 20:40:41氏ね
0835832
2007/01/12(金) 20:45:19WSH使うんですね!
require 'win32ole'
WIN32OLE.new('WScript.Shell').Popup("hoge", 0, "error")
0836832
2007/01/12(金) 21:05:59unixなど、win32oleが上手く行かない環境の場合に、フラグ立てて、
違う処理をしたい(例えば、標準出力にメッセージを出す)のですが
begin
require 'hoge'
rescue
end
とかでも普通にエラーが出てしまいます。
コンパイル時にエラー出しているんですかね
なんとかする方法はないでしょうか?
0837デフォルトの名無しさん
2007/01/12(金) 21:07:34eval をうまく使ってみるとか。
0838デフォルトの名無しさん
2007/01/12(金) 21:10:420839デフォルトの名無しさん
2007/01/12(金) 21:12:580840デフォルトの名無しさん
2007/01/12(金) 21:13:020841832
2007/01/12(金) 21:39:07それだ(゚∀゚)
is_win32 = begin
require 'win32ol'
true
rescue LoadError
false
end
0842デフォルトの名無しさん
2007/01/12(金) 23:57:560843デフォルトの名無しさん
2007/01/13(土) 00:04:240844デフォルトの名無しさん
2007/01/13(土) 00:54:290845デフォルトの名無しさん
2007/01/13(土) 10:01:15たとえば
0846デフォルトの名無しさん
2007/01/13(土) 10:05:08たとえば、以下のようにしたいと思ってます。
class Foo
end
foo = Foo.new
# ここまで実行して、そのコンテキスト(?) で irb を起動したい。
# require "irb"
# IRB.start
# ↑だと Foo クラスは見えるのですが、foo が見えません。
0847デフォルトの名無しさん
2007/01/13(土) 10:56:23irbの呼び出しはそのとおりでいいけど、fooが見えない、というのは
スコープの問題と言っていいのだろう。
あるファイル中のトップレベルで定義したローカル変数は、同じ
ファイルの関数や、他のファイルから参照できない。
たとえ同じファイルでも、異なるメソッドからはローカル変数って
引数として渡さない限り参照できないだろ?
グローバル変数か、定数にするしかないな。
0848デフォルトの名無しさん
2007/01/13(土) 11:04:580849デフォルトの名無しさん
2007/01/13(土) 12:32:53Edit1 と Edit2 があったとします。
Edit1にフォーカスが当たった状態でタブキーを押すと
Edit2にフォーカスが移動するようにしたいのですがどのようにすればよいのでしょうか?
0850デフォルトの名無しさん
2007/01/14(日) 03:12:43i=0
while i<4
print i if (1<=i)..(2<i)
i += 1
end
を実行すると、12が表示されるのではなく、123が表示されてしまいます。
期待する12という表示はなぜ得られないのでしょうか?
0851デフォルトの名無しさん
2007/01/14(日) 06:31:47if x
などで偽と判定されるのは、
・xがfalseだったとき
・xがnilだったとき
の場合のみだ。Rangeオブジェクトはそのどちらでもないので、真になる。
0852デフォルトの名無しさん
2007/01/14(日) 07:40:290853デフォルトの名無しさん
2007/01/14(日) 07:50:33例を挙げよ。
0854デフォルトの名無しさん
2007/01/14(日) 07:57:300855デフォルトの名無しさん
2007/01/14(日) 08:06:38それは単にnilになってないだけでは
空(empty)であることとnilであることは違う
irb> unless nil then puts 'NIL' else puts 'NON-NIL'end
NIL
irb> unless '' then puts 'NIL' else puts 'NON-NIL'end
NON-NIL
irb> unless ''[0] then puts 'NIL' else puts 'NON-NIL'end
NIL
irb> arr=Array.new
irb> unless arr then puts 'NIL' else puts 'NON-NIL'end
NON-NIL
irb> unless arr[0] then puts 'NIL' else puts 'NON-NIL'end
NIL
irb> hash=Hash.new
irb> unless hash then puts 'NIL' else puts 'NON-NIL'end
NON-NIL
irb> unless hash['hoge'] then puts 'NIL' else puts 'NON-NIL'end
NIL
0856デフォルトの名無しさん
2007/01/14(日) 08:34:21これはRangeオブジェクトじゃなくて条件文の範囲式。
http://www.ruby-lang.org/ja/man/?cmd=view;name=%B1%E9%BB%BB%BB%D2%BC%B0#a.c8.cf.b0.cf.bc.b0
ここでわかるように式2が真になるまでが条件だから、
i=0 1<=iでないので偽
i=1 1<=iが成立し、同時にi<2となり、結果自体は真
i=2 上で一周しているから1<=iを調べるとこれが真で、i<2が成立しないので結果は真
i=3 i<2が成立しないので真
となる。
範囲式のふつうの使い方は、
i = 0
while i < 4
print i if (i==1)..(i==2)
i += 1
end
とかかな。
でもまあ、ふつうはこういう書き方はしない方がいいです。
おれ、このスレの回答以外でこの書き方したことないよ。
0857デフォルトの名無しさん
2007/01/14(日) 10:57:230858デフォルトの名無しさん
2007/01/14(日) 13:40:57if /re/ とか書けるっけ?
0859デフォルトの名無しさん
2007/01/14(日) 13:55:51(それ書いてもどうなるものでもなさそうだけど)
0860デフォルトの名無しさん
2007/01/14(日) 13:59:170861デフォルトの名無しさん
2007/01/14(日) 14:08:030862デフォルトの名無しさん
2007/01/14(日) 14:21:33これって、if 自身が状態を持っているようですね。ローカル変数のような。
そのため、以下のソースを実行すると、x=3,y=5と表示されることがあります。
x = 1
while x <= 4
y = 5
while y <= 9
b = y == 6
e = y == 8
printf "x=%d,y=%d\n", x, y if b..e
break if x==2 && y==6
y += 1
end
x += 1
end
0863デフォルトの名無しさん
2007/01/14(日) 16:04:08>>856
式2は (i<2) ではなくて (2<i) です。
> ここでわかるように式2が真になるまでが条件だから、
式2が偽になった回でもその一回は結果として真になる、ということですよね。
そこで、 (2<i) の部分を (2<=i) にすれば意図どおりのタイミングで偽になるように
なるかと思って試しましたが、これも123と表示される結果となりました。
そこで856の「一周しているから」という文により気づいたのですが、式2が真となった
回の次回以降は、リファレンスにあるように偽になるのではなく、式1の評価に戻る、
ということですね。
そうなると、式2を(2<=i)と変更した場合に 3 が表示される理由も分かります。
ようやっと条件式としての範囲式の意味が理解できました。
856さん、他のみなさん、ありがとうごさいました。
>>862
その式の状態が、コード単位なのかメソッドの属するオブジェクト単位なのか
スレッド単位なのかメソッド呼び出し単位なのかよく分からんことから
範囲式について調べようと思った、というのがそもそもの動機なのですが、
>856> でもまあ、ふつうはこういう書き方はしない方がいいです。
と言われているとおり、862をみると、「一周する」ということが確かな状況以外では
誰が読んでも意味不明なコードになるだろう、ということは分かりました。
もし純粋にif文単位で状態が保持されるのなら、例外で中断して再開した場合に
その式を評価した場合に状態が引き継がれたりするなどひどい泥沼になるように
思えるので、深入りせずここらで引き上げることにします。
0864デフォルトの名無しさん
2007/01/14(日) 18:40:27メソッド呼び出し単位。
状態を持っているのはifではなくて、flip-flop operatorで自動的に作られる
隠しローカル変数。
0865デフォルトの名無しさん
2007/01/14(日) 20:19:46864を見て試してみましたが、たしかにメソッド単位のローカル変数のようですね。
Proc.newやloopやtimesなどにブロックを渡してその中で範囲式を使ってみましたが、
ブロック内のローカル変数とは違って、状態は記憶されているようです。
ブロック付きopenをループやretryで複数回実行するときなどは注意が必要そうですね。
0866デフォルトの名無しさん
2007/01/15(月) 11:47:080867デフォルトの名無しさん
2007/01/15(月) 13:08:37awk/sed ではそれなりに使ったけど
perlやrubyでは使ったことない。
0868デフォルトの名無しさん
2007/01/15(月) 16:45:53http://www.ruby-lang.org/
0869デフォルトの名無しさん
2007/01/15(月) 17:00:400870デフォルトの名無しさん
2007/01/15(月) 17:08:38どもでした。
0871デフォルトの名無しさん
2007/01/16(火) 02:59:10みたいに、ローカル変数を取り消すことってできますか
0872デフォルトの名無しさん
2007/01/16(火) 05:37:090873デフォルトの名無しさん
2007/01/16(火) 11:01:25str[100,350] = "g"
でやると、一文字しか置換されないのです。かといって"ggggg…"のように長くは間違いがでそうだし
何か簡単にする方法はありませんか?
0874デフォルトの名無しさん
2007/01/16(火) 12:25:20Rubyでは同じ文字列のくり返しは乗算で実現できる。
"g"*350とか。
0875デフォルトの名無しさん
2007/01/16(火) 12:26:400876デフォルトの名無しさん
2007/01/16(火) 12:27:280877デフォルトの名無しさん
2007/01/16(火) 12:58:22nilを代入するのではダメでシンボルテーブルから変数名自体を消したいってこと?
>>872
undefはメソッドしか未定義にできないな。
これも厳密には未定義にするわけじゃなかったり。
0878デフォルトの名無しさん
2007/01/16(火) 13:06:30"g"*350000000とすると、メモリを300MBも消費しました。
なんとかする方法はないですか?
0879デフォルトの名無しさん
2007/01/16(火) 13:22:110880デフォルトの名無しさん
2007/01/16(火) 13:23:400881デフォルトの名無しさん
2007/01/16(火) 13:42:570882デフォルトの名無しさん
2007/01/16(火) 15:17:30ループでやったって置換した結果の文字列のほうは結局大きくなるんだから変わらん気がす。
てっきり勉強目的で意味がないことをやってるんだと思ってたんだけど
なんか目的があるなら、それを言えばなんか考えてくれる人がいるかもよ。
特に意味はない話ならメモリを300MB使うことなどなんら問題じゃない。
0883デフォルトの名無しさん
2007/01/16(火) 15:21:170884デフォルトの名無しさん
2007/01/16(火) 15:45:25strの両方が存在するから1つずつ置き換えていくよりメモリは余計に必要。
だと思ったんだが、もしかしてRubyでは部分文字列は共有されてるのかい?
0885デフォルトの名無しさん
2007/01/16(火) 17:31:36ファイルに保存するなら置換しながら…というか書き込みながら続ければいいわけだし
0886デフォルトの名無しさん
2007/01/16(火) 18:00:15>>885
それが一番の問題だと思う。初心者スレだからなおさらだな。
strに350MBもデータをコピーしてる時点でなんか間違ってる
可能性が大きいわけで、fillを使えば済む話じゃないかもしれん。
0887デフォルトの名無しさん
2007/01/16(火) 19:32:58いろいろと調べてみたのですが、わからないのでどなたかわかる方がいらっしゃったらよろしくお願いします。
0888デフォルトの名無しさん
2007/01/16(火) 19:33:500889デフォルトの名無しさん
2007/01/16(火) 20:44:30フォルダをクリックして確かめる。
0890デフォルトの名無しさん
2007/01/16(火) 21:23:56FileTest.exist?(filename)
filename が存在する時、真を返します。
0891デフォルトの名無しさん
2007/01/17(水) 00:28:12http://www.itmedia.co.jp/enterprise/articles/0701/15/news024.html
1回目と2回目のインタビューのリンクもあるので、Rubyファンはぜひ。
0892878
2007/01/17(水) 00:28:460893デフォルトの名無しさん
2007/01/17(水) 00:58:12クラスメソッドなら
class ClassA
・・・
end
def ClassA::method_b
・・・
end
のような形で書けるみたいですがインスタンスメソッドの場合がどうも見当たらないんです。
0894デフォルトの名無しさん
2007/01/17(水) 01:27:57ClassA.class_eval{
def foo
・・・
end
}
0895デフォルトの名無しさん
2007/01/17(水) 01:39:51できました。ありがとうございます。
0896デフォルトの名無しさん
2007/01/17(水) 02:01:02>プログラミング言語はすべて愛おしい
∩___∩ |
| ノ\ ヽ |
/ ●゛ ● | |
| ∪ ( _●_) ミ j
彡、 |∪| | J
/ ∩ノ ⊃ ヽ
( \ / _ノ | |
.\ “ /__| |
\ /___ /
0897デフォルトの名無しさん
2007/01/17(水) 02:21:12> str.fill("g",100..350)
String#fillなんてあったっけ?
0898デフォルトの名無しさん
2007/01/17(水) 02:35:38fillはArrayだった。886は間違い。
0899デフォルトの名無しさん
2007/01/17(水) 03:16:37なんでこれが、クラスではなくインスタンスのメソッドになるのか
ちっとも理解できないのだけれど……。
分かりやすいサイトプリーズ
0900デフォルトの名無しさん
2007/01/17(水) 03:20:07リファレンスに書いてあるよ。
0901デフォルトの名無しさん
2007/01/17(水) 03:23:46わかりやすいサイトは思いつかないが、スコープの問題を除けば、
class ClassA
# X
end
と、
ClassA.class_eval{
# Y
}
とでは、XとYは同じ環境になる。
単にそれだけ。
0902デフォルトの名無しさん
2007/01/17(水) 03:34:38特定のインスタンスだけに定義されたメソッドを混同していた。
さいきんruby使う暇なくて忘れてたorz
0903デフォルトの名無しさん
2007/01/17(水) 07:00:53>nilを代入するのではダメでシンボルテーブルから変数名自体を消したいってこと?
そうです。ERB用にこんなことをしたいんです。
# HashからBindingをつくる
def create_binding(_hash)
_defstr = _hash.inject('') { |_s, _e| _s << "#{_e[0]} = _hash[#{_e[0].inspect}];" }
eval _defstr
#undef _hash, _defstr # これができないものかと。
binding()
end
b = create_binding(:a=>10, :b=>'foo', :c=>%w[x y z])
0904デフォルトの名無しさん
2007/01/17(水) 09:39:30たしか Matz は I hate C++. と逝っていたと思うんだけど、
それでもいとおしいと思ってるんだね。
0905デフォルトの名無しさん
2007/01/17(水) 09:41:290906デフォルトの名無しさん
2007/01/17(水) 10:01:30むしろ一時変数なんか気にすんなって言いたいが。
そもそもevalした時点で安全でなくなっているわけだし。
ハッシュ受け取ってローカル変数なりクラス変数なりに展開するERBの子クラスを作ればいいんじゃないのか。
0907デフォルトの名無しさん
2007/01/17(水) 11:25:02流れ見ないで書き込むんだけど、evalとかで変数表を表示したときに
一時変数も一緒に出て来てしまうのが気に入らないとか?
0908デフォルトの名無しさん
2007/01/17(水) 11:56:36とりあえず現在のところローカル変数を明示的に消すことはできない
のでやりかたを変えるしかない。
レス数が900を超えています。1000を超えると表示できなくなるよ。