Ruby 初心者スレッド Part 27 at TECH
[2ch|▼Menu]
421:デフォルトの名無しさん
09/04/15 01:22:26
>>401
>参照した影響っていつまで残るんでしょうか

sliceすると、sliceされた配列も新しく出来た配列もシェア状態になる。
シェア状態になった配列を破壊的に変更するとコピーが起きる。
コピーがされたらシェア状態じゃなくなる。

というわけで、破壊的変更がされるまで。

422:デフォルトの名無しさん
09/04/15 01:24:15
以前からArrayはcopy on writeに違いないと訳もなく信じていたのだけど、
今回の話でちょっと興味を持ったので少し実験してみた。
もしかして一部分でも書き換えたら、巨大な配列だろうと丸コピーしてる?

irb(main):001:0> a = Array.new(1<<24) { |i| i } # メモリ使用量70MB程度
irb(main):002:0> b = Array.new(1<<8) { a[1..-1] } # メモリ使用量そのまま
irb(main):003:0> b.each { |e| e[0] = 1 } # たった256要素も変更できない
NoMemoryError: failed to allocate memory
from (irb):3:in `[]='
from (irb):3
from (irb):3:in `each'
from (irb):3
from :0

ソースを読むだけの気力も能力もないので適当なことを言わせてもらうけど
配列をブロックに小分けするようなことはしていないようにみえる。

ガチガチの配列ならともかく、RubyのArrayってどこにでも追加削除可能な
万能コンテナみたいだから、内部的にはある程度の長さのブロック(配列)と
ハッシュやツリーなんかの混合構造の方が効率良さそうに思えるけど。
それとも、やり過ぎて添字アクセスが遅くなるのを嫌っているのかな?

423:デフォルトの名無しさん
09/04/15 02:05:38
>配列をブロックに小分けするようなことはしていないようにみえる。
その通り。

>ハッシュやツリーなんかの混合構造の方が効率良さそうに思えるけど。
>それとも、やり過ぎて添字アクセスが遅くなるのを嫌っているのかな?

たぶん、ちゃんと検討されたことはない。でも、

- この最適化で速くなるRubyプログラムは少なそう(多いというなら説得が必要)
- わずかだろうけど遅くなるプログラムは結構ありそう(添字アクセス)
- 配列がflatなメモリだと期待している拡張ライブラリ(非常に多い)が動かなくなる

というあたりから、標準のArrayに組み込むのは微妙かなあ。
SparseArrayみたいな別ライブラリがいいと思う。やるとしたら。

424:デフォルトの名無しさん
09/04/15 03:07:21
java で、
Vector → ArrayList
さらに LinkedList や CopyOnWriteList と、言語のバージョンが上がるごとに List の派生クラスが増えていったように
Ruby も Array の派生組み込みクラスが作られていくかな?

Ruby の文化からすると、あまりそういうことはしなさそうだけど。

425:デフォルトの名無しさん
09/04/15 05:18:29
>>422
URLリンク(i.loveruby.net)

426:デフォルトの名無しさん
09/04/15 05:48:59
>>425

422じゃないけど、Rubyの場合は
基本的に変数はすべて参照になっているって事でいいのかな。

irb --prompt simple
>> a = [1, 2]
=> [1, 2]
>> b = a
=> [1, 2]
>> a << 3
=> [1, 2, 3]
>> a << 4
=> [1, 2, 3, 4]
>> b.size
=> 4
>> b
=> [1, 2, 3, 4]

この場合、aとかbってのはただのラベルで配列の実体は別の場所にあるってことでいい?

427:デフォルトの名無しさん
09/04/15 06:53:21
> 基本的に変数はすべて参照になっているって事でいいのかな。
いいと思うけど、俺にアンカーつける必要なくない?
他にもいい人はたくさんいるよ

428:422
09/04/15 08:15:18
>>423
組み込みオブジェクトの内部表現が変わってもスクリプト側には
影響ないと思ってたんだけど、拡張ライブラリが駄目なのか。

>>424の言うように派生クラスにするか、Arrayを初期化するときに
内部実装を選択するヒントとかパラメータを指定できるようになれば
面白いかなって思ったんだけど。


>>425
これ、Ruby Hacking Guideってやつだよね?
Webで見れたとは、こりゃありがたい。
後でゆっくり読ませてもらうわ。

429:デフォルトの名無しさん
09/04/15 08:32:04
初心者スレだったんだっけ

>>426
オブジェクトを「捕まえる」「入れておく」ことはできない
名前で参照するしかない
変数に対する = は、"右辺" の指すオブジェクトに新たなラベルをつける行為で、本当は「代入」ではない
irb> a = [1, 2]
irb> b = a
irb> a << 3
irb> p (a.object_id == b.object_id)
true

で、スレ的にもこれだけでいいと思うんだが、こっからがめんどい
irb> a = [1, 2, 3, 4, 5]
irb> p (a[0..2].object_id == a.object_id)
false

a と a[0..2] は違うオブジェクトなので、
  [1, 2, 3, 4, 5]
  と
  [1, 2, 3] ← a[0..2] が返す、できたてほやほや配列
という2つの配列オブジェクトが(Rubyの「オブジェクト置き場」に)存在しているように感じるが、実は
  [1, 2, 3, 4, 5] <共有済>
  と
  <注: id:3324 の配列を共有、0要素目から2要素目までを返す、ただし、破壊的変更が来たら配列内容をコピーして保持する>
という、1つの「share された」配列と1つの「share した」配列になってる
これらは自分が share 関係にある配列と自分が share 状態であるということを覚えていて、破壊的変更が自分に来たら share 関係にある配列にそれを通知する
通知または破壊的変更がきた場合の動作は
 ・ 自分が共有元(a)である場合は share 状態を解除し普通の配列に戻る(破壊的変更を自分が受けていた場合は受け付ける)
 ・ 自分が共有先(a[0..2])である場合は共有元の要素の参照をきちんと複製して share 状態を解除し普通の配列に切り替える
ということである、というようなてきとーな理解でいいか>>421
array.c を読めばなんか書いてあるのかね

430:デフォルトの名無しさん
09/04/15 08:40:40
この最適化が入ることで、逆にそれ以外のところが遅くなるはずだが、
配列って部分参照することってそんなにあるっけ?


431:デフォルトの名無しさん
09/04/15 08:43:53
>>429
ん、単純に

[ <id:0011>, <id:0013>, <id:0015>, <id:0018>, <id:0411> ]

という普通の配列と

[ a[0], a[1], a[2] ] # a が変更されたらオブジェクトIDの参照に切り替えること

の関係になるという話なんじゃないの?
や、こんな 2段階やるくらいなら最初から [ <id:0011>, <id:0013>, <id:0015>] という配列作っとけよ、という感じではあるんだが

432:デフォルトの名無しさん
09/04/15 10:03:58
お、おまいらここは初心者スレだぜ( ´ー`)y─┛~~ コウドナワダイデビビラスナ

433:デフォルトの名無しさん
09/04/15 10:19:32
>>420の分かってないっぷりにワロタw

434:デフォルトの名無しさん
09/04/15 10:24:56
>>431
オブジェクトにラベルを新たに付けるという行為が、
配列をインデックスで参照するように指定するという行為よりずっとコストのかかる行為であった場合には、
[ a[0], a[1], a[2] ] のほうが有効だと思われ
ホントのとこはどうなのかは知らない

435:デフォルトの名無しさん
09/04/15 10:28:46
また仕様バグか

436:デフォルトの名無しさん
09/04/15 10:56:44
require 'benchmark'

a = (1..1000000).to_a
Benchmark.bmbm do |bm|
bm.report('a に追加'){a.delete_at(0); a.push("s")}
end
a = (1..1000000).to_a
Benchmark.bmbm do |bm|
bm.report('部分参照して追加'){a[1..-1].push("s")}
end

結果:
               user   system   total    real
a に追加        0.050000  0.000000  0.050000 ( 0.048458)
               user   system   total    real
部分参照して追加  0.050000  0.010000  0.060000 ( 0.053062)

破壊的変更した際に別に遅くなるとも思えんのでバグではないな
部分参照だけをした場合が笑えるほど速いので問題は無い

…まあ、push しただけなのにdeleteとpushの2段階と同レベルの処理速度に落ちるということ自体
コードの見かけと実際の関係上あまりよくないという観測もなくはない気もするが
(つまり、「共有の配列」から「本当の配列」に変換される、Rubyの裏側の動作がかなりごっつい)

437:デフォルトの名無しさん
09/04/15 11:21:01
>>436
残念
遅いのは delete_at の部分
share の部分配列を通常の配列に変換する、というのは、
配列から要素を削除して詰める、という行為と大して変わらない

ちなみに、これがわりと速いぞ

a2 = Array.new
a2.push(*a[1..-1])

配列の一部分を得たい場合は配列のスライス arr[s..e] を使うほうがいい、ってことだな

438:デフォルトの名無しさん
09/04/15 12:41:21
エラーが出ても処理を止めず、最後まで実行するようにしたいのですが、どうすればよいでしょうか??
PHPのようにブラウザで実行したとき、エラーメッセージをエラーが出た部分に出力するようにしたいのです。
begin とか rescue を使えばできるのかな?と思っているのですが・・
ご教示頂けると幸いです。

439:デフォルトの名無しさん
09/04/15 13:20:37
>>438
エラーが出たってことはそれ以上処理ができないということ

で、まあ、使ってるフレームワークのヘルプでも読め
処理中に起こって止まる原因となった例外をWebブラウザ上に表示させる方法がたいてい載ってる

440:デフォルトの名無しさん
09/04/15 13:24:30
レスどもです。
PHPの場合はエラーが発生してもなんとか最後まで実行しようとしてくれますよね??
rubyだとエラーが発生したあとの処理はどう頑張ってもやってくれないということでしょうか?

441:デフォルトの名無しさん
09/04/15 13:32:47
とりあえず、いきなりCGI作るのやめろ
RubyはCGIを特別扱いしない
普通のコンソールのスクリプトでどういうことができるか勉強してからCGIやれ
きっとそっちのほうが早い

442:デフォルトの名無しさん
09/04/15 13:37:33
PHPはWebブラウザから入力してWebブラウザに出力する特化型言語だからなあ…

> PHPの場合はエラーが発生してもなんとか最後まで実行しようとしてくれますよね??
いいえ

443:デフォルトの名無しさん
09/04/15 13:49:20
PHPのエラーってWarningのこと言ってるの?
それ以上処理できなかったらPHPだって止まるよ

444:440
09/04/15 14:50:12
あそうか、warningの時は続けて実行してくれるけれど、fatal error の時はPHPでも止まるのか・・勘違いしてました、すいません。
ありがとうございますm(_ _)m

445:デフォルトの名無しさん
09/04/15 18:26:19
klassってなんですか><

446:デフォルトの名無しさん
09/04/15 18:27:25
klassの部分をclassに修正してみれば分かるよ

447:426
09/04/15 19:57:26
遅レスだが

>>429
だいたいその理解でおk
細かいこというと、共有元を破壊的に変更する場合は、シェア状態を解除
するのではなく、複製してそっちを指すようになる。つまり共有先と同じ

>>431,434
ちがう

448:デフォルトの名無しさん
09/04/15 21:36:05
>>445-446
clazzを使う流儀もあるな。


449:デフォルトの名無しさん
09/04/15 23:01:12
このスレってmatz, yugui, yarv, shugoさんとかが名無しで答えてたりするのかなぁ

450:デフォルトの名無しさん
09/04/15 23:26:03
少なくともよく答えてることはまずないと思う。
1〜2週間スレを見てればわかる。答えてたら失望するわ、おれ。

451:デフォルトの名無しさん
09/04/15 23:29:00
ここまでMatzの自演

452:デフォルトの名無しさん
09/04/15 23:29:53
こんな金にならないスレに顔出すより、
ブログに何か書く方が大事だろw

453:デフォルトの名無しさん
09/04/15 23:34:02
しかし、こういう立場のひとってブログに大きな態度で書けないよな。
リーナス君のようにならないことを祈る。。

454:デフォルトの名無しさん
09/04/15 23:36:39
どっちもどっちのような

455:デフォルトの名無しさん
09/04/16 05:58:10
内容見ずに態度見るような馬鹿を気にしてもしょうがないよ。
有名になると、何書いたって行為と悪意を両方増やす結果になるし。

456:デフォルトの名無しさん
09/04/16 05:59:32
×行為 ○好意

457:デフォルトの名無しさん
09/04/16 09:03:10
>>449
Ruby1.9には2ch bot yarvを新装備!


458:デフォルトの名無しさん
09/04/16 10:00:57
RSpec で、 hogehoge.rb に対して hogehoge_spec.rb を作ったら、シェルの補完で

  hog <Tab>

と打って hogehoge.rb が一発で出るとかそういうのが阻害されてしまうから不便だ、という話をしたら

 spec ファイルは spec/ ディレクトリにまとめて入れろバカ

というツッコミが来た
知らんかった
でもこれって spec ファイルのほうからどうやってオリジナルのスクリプト読むん?

459:デフォルトの名無しさん
09/04/16 10:11:22
>>458
> spec ファイルは spec/ ディレクトリにまとめて入れろバカ
Rails on Rails の流儀だな
spec ディレクトリは自動で追加される環境の人だ
自力でどうにかできるものではないので、Rails で作ってないなら無視してよし
一応 File.expand_path とか File.dirname(__FILE__) とか駆使したファイルパスを require するようにすればなんとかなるとは思うが

460:デフォルトの名無しさん
09/04/16 10:23:47
>>458
俺の場合は __FILE__ を基準にして、他の場所のオリジナルを読むようにしてる
たとえばlibディレクトリなら

Pathname.new(__FILE__).dirname.parent.parent + 'lib'

で探す

461:デフォルトの名無しさん
09/04/16 10:27:58
RSpec使ったことないけど
補完の問題だけを考えるとspec_hogehoge.rbにするのはどうか?

462:デフォルトの名無しさん
09/04/16 10:31:18
>>458
$LOAD_PATH << ".." << "../lib"
require 'spec'
require 'hoge'
...

オフィシャルなファイルと被るファイル名の自作ファイルがあると動作しないのが難点だが、
require はまあそもそもそんなもんだな
ただ、下手に lib/ と spec/ があると、Rails の auto_spec.rb とか
なんかあのへんが動作すると期待されてしまうかもしれない

463:デフォルトの名無しさん
09/04/16 10:37:27
>>461
一応、spec/*_spec.rb というファイルをまとめて実行して
一気に lib/ 内のファイルのテストを試すサポートプログラム(autospec)が存在するので、
いつか自動テスト実行を覚えた時用に hogehoge_spec.rb という名前であったほうが好ましい

が、一人で使うぶんには spec_hogehoge.rb にしておくのがいちばん無難だな、めんどくさくないし

464:デフォルトの名無しさん
09/04/16 11:37:51
>>458-459
別にRails流ってこともないだろ。
Gemsとかつくる前提のときも spec/ に入れるのが一般的だし、
autotestも標準で spec/以下 と lib/を関連付けて見てくれる。

といっても、慣例でしかない気がするけど

465:デフォルトの名無しさん
09/04/16 14:18:57
>>458
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')

とかかな。
いちいち書くのめんどくさけりゃ>>464のいうautotestや、
Rakeにspec/rake/spectaskのSpec::Rake::SpecTaskを使って
テスト実行を肩代わりしてもらう。

この二つはデフォでは spec/*_spec.rb を相手にするから
たかが慣習、されど慣習と。

466:デフォルトの名無しさん
09/04/16 16:28:48
ねーよw

467:デフォルトの名無しさん
09/04/16 19:04:41
ファイルのロックを File#flock でなく IO#fcntl で実装しようかと思ったんですが、
これシステムの struct flock に依存するから簡単には portble に書けないですかね?

468:デフォルトの名無しさん
09/04/16 20:55:51
どこまでのポータビリティを求めてるのかによる。
Windowsとか言い出すなら問題外。

469:デフォルトの名無しさん
09/04/16 21:14:34
あ、rspec の、エクスペクテーションの should をまとめたいと思ってメソッド定義するよね
あれってどこに書くべき?
before で作ったインスタンス変数が読めなかったり def で定義したメソッドが見えなかったりでどこがどう妥当なのかよくわからん

470:デフォルトの名無しさん
09/04/16 21:59:37
>>469
何を言いたいのかよく分からないが
it (specify) を、複数の ExampleGroup で共有したいって事なら
share_as メソッドを探すと幸せになれるかもしれない

471:デフォルトの名無しさん
09/04/16 22:09:06
…たぶん、

describe Hoge do

 before :all do
  @val1 = ... ; @val2 = ...
  # (1)
 end

 (2)

 describe "#foo" do
  matomete_val_tesuto
 end

end

としたいときに、 def matomete_val_tesuto を (1) に書くか (2) に書くかって話なんじゃね
(1) に書いたら describe "#foo" の中では使えないはず
(2) に書いたら @val1 にアクセスできんな

472:デフォルトの名無しさん
09/04/17 00:13:56
setter の返り値について質問
a.hoge = b.hoge = value みたいな書き方ができるようにしようと思うのですが、

def hoge=(value)
@hoge = validate(value)
@hoge
end



def hoge=(value)
@hoge = validate(value)
value
end

ではどちらがいいでしょうか?
場合によって value != validate(value) となります。

473:デフォルトの名無しさん
09/04/17 00:22:53
> a.hoge = b.hoge = value みたいな書き方ができるようにしようと思う
そういうのやめとけ
めんどくさいから

ちなみに、 = つきメソッドは引数を返すように作られていることが期待されてる
つまり、

def hoge=(val)
 @hoge=val
end



474:デフォルトの名無しさん
09/04/17 00:28:15
前者をよしとする人はいないんでないの
a=b=c が a==b==c にならないのはバグの元だし
オペレータオーバーライドの悪い点をわざわざ利用する必要はないよ

475:デフォルトの名無しさん
09/04/17 00:31:08
今調べたら、セッターとして使うと引数が問答無用で返って、
sendで呼ぶと返した値が返る

476:デフォルトの名無しさん
09/04/17 00:37:49
>>475
うわあこれ知らんかった
今まで引数の値をわざわざ返してたのにー

477:デフォルトの名無しさん
09/04/17 00:44:12
…。

いや、なんつーか、 hoge = 1 の返り値は 1 だというのは知ってるよな
def set_hoge
 @hoge = 1
end

これの返り値は 1 だし、attr_* 系で作られる hoge= みたいなメソッドも引数を返す


478:472
09/04/17 00:48:14
皆さんレスありがとうございます。

>>475
>今調べたら、セッターとして使うと引数が問答無用で返って、

ほんとだw
そもそも返り値を選択できなかったとは……

def hoge=(value)
return
end

でも引数が返ってきました。
setter の呼び出しは処理系が特別扱いしてるんですね。

479:デフォルトの名無しさん
09/04/17 01:25:51
[ruby-core:00637]より。

|If an assignment method which doesn't return an argument is not
|intuitive, why don't ruby force it?

Agreed. Last time I thought that, I was too lazy to modify compiler
itself, and then forgot. I will fix it someday.

だって。

480:472
09/04/17 02:25:15
>>479
なるほど。
その結果として 1.8 では setter の戻り値を破棄して
引数を返すように変更されたと

確認してみたらピッケル本にもそのことがちゃんと書いてありました(言語編 p76)

481:デフォルトの名無しさん
09/04/17 08:42:59
>>477
バーカ

というかお前322と似てるな。バカ具合が

482:デフォルトの名無しさん
09/04/17 09:00:50
わざわざ終わった話題に安全圏から罵倒、というのはつい最近どこかで

483:デフォルトの名無しさん
09/04/17 09:45:27
クラスメソッドのエイリアスはどうやって定義しますか。

484:デフォルトの名無しさん
09/04/17 09:52:51
class Hoge
 def self.hoge ; end
 class << self
  alias hage hoge
 end
end
これ以外の方法知らん。他のやり方があったら教えて。

485:デフォルトの名無しさん
09/04/17 10:23:07
>>484
alias メソッドを使うとしたらそれくらいしかなさそうだな
あとは普通に self.hoge の中で self.hage を呼ぶしかあんめえ

486:デフォルトの名無しさん
09/04/17 10:43:50
alias_methodを使うというひねりもできるが、メタクラスを使う以外の方法はない。

487:デフォルトの名無しさん
09/04/17 10:48:13
rubyでcgiを作ろうと思います
postを受け取るにはどうすればいいですか

488:デフォルトの名無しさん
09/04/17 10:52:20
>>487
他の言語でpostを受け取るのと同じ方法でできます。

489:デフォルトの名無しさん
09/04/17 11:05:40
>>487
単純には、標準入力に環境変数CONTENT_LENGTH長だけ入ってる、はず。
マルチパートやらデコードやらいろいろあるので、ライブラリを使うのが吉。
どのライブラリをどんな風に使うのがいいのかは、詳しい人を待って(オイ)。

490:デフォルトの名無しさん
09/04/17 13:46:48
>>488
うん、変わらんな
というか一度は自力でPOSTとか全部やってみたほうがいいと思うんだ

>>487
標準で cgi というライブラリがあるからそれ使え
自力で外部ライブラリをインストールしてもいい環境なのなら、
rubyforge から cgialt をインストールしてそれを cgi 互換ライブラリとして使え
他にもいくつかあるが、cgi ライブラリの使用経験とかを前提にしてたりするんで、最初は素直に cgi ライブラリ使え

491:デフォルトの名無しさん
09/04/17 14:36:38
rubyのcgiはかなりアレ。

492:デフォルトの名無しさん
09/04/17 16:14:01
>>468
メジャーな UNIX (Linux, *BSD, Solaris あたり) で動けば十分なんですが、
Google ソースコード検索や Koders でも Ruby の fcntl の用例が少ないみたいなんで
Ruby Inline か拡張ライブラリで fcntl(2) を直接使うことにします。

493:デフォルトの名無しさん
09/04/17 16:51:33
>>491
アレって何?


494:デフォルトの名無しさん
09/04/17 17:07:46
>>492
IOクラスにfcntlメソッドがあるので、わざわざそんな難しい方向に行かんでもええよ

495:デフォルトの名無しさん
09/04/17 17:07:54
指示代名詞も知らないゆとり乙

496:デフォルトの名無しさん
09/04/17 17:09:43
>>493
491じゃないが、仕様と実装が残念だった。
1.9系で後者は改善されたけど。

497:デフォルトの名無しさん
09/04/17 17:38:58
>>494
その IO#fcntl ですが、例えば file.fcntl(Fcntl::F_GETLK, arg) するとき、
arg には struct flock に pack したものを指定する必要があるのですが、
struct flock にどんなメンバがあるかは Ruby レベルからは知り得ないので、
やっぱり C で書く必要があると思うのです。

498:デフォルトの名無しさん
09/04/17 18:01:32
>>497
なんだ、そんなレベルのポータビリティでいいのか。

499:デフォルトの名無しさん
09/04/17 19:35:12
>>487
今ならRack使う方がいいと思う

500:デフォルトの名無しさん
09/04/17 19:44:30
初心者に標準添付以外をいきなり勧める人って何なの

501:デフォルトの名無しさん
09/04/17 20:49:03
今ならgem install rackするだけだろ?

rubyみたいな日本だけのドマイナー言語を選んで、さらにcgiがやりたいなんて
茨の道を歩くのは覚悟してもらわなきゃ


502:デフォルトの名無しさん
09/04/17 21:01:04
> rubyみたいな日本だけのドマイナー言語を選んで、さらにcgiがやりたいなんて

海外の開発系カンファレンスに何度か出席しているが、
どうみても日本より海外の方が、Ruby の関心が高い。

むしろ日本人は「Ruby 出来ない子」が多い、と感じる。

503:デフォルトの名無しさん
09/04/17 21:07:40
> 海外の開発系カンファレンス

そういうやつらは「寿司、天ぷら、藤山、芸者」の日本好きの変わり者geekだろ。
狭いコミュニティに閉じこもって「関心が高い」じゃないだろ。

目を覚ませ。もう戦争は終わったんだ。
今は蛇言語でgwtの時代なんだよ。

504:デフォルトの名無しさん
09/04/17 21:12:12
せめてこのスレでは、Ruby初心者に有益な情報を書くように心がけられないもんかね
Pythonがいいよってのも、Rubyのことを聞きに来た人間を迷わせる効果しかないと思うんだがね

アンチは本スレでもアンチスレでも行けばいいんだ。
初心者スレにまで顔出すことはなかろうに。本格的に人間性を疑うわ。

505:デフォルトの名無しさん
09/04/17 21:12:23
カンファレンスは知らないがおれもそれは感じる。
新しいバージョンとかでつまづいたときググると、
役に立つのは大抵海外のサイト。向こうの方が精力的にやって気がする。
2ちゃんなんてRubyスレ全般で「1.9は使うな」だもんな。
2ちゃん見てる時点でアレだろと言われたらそれまでなのだが。

506:デフォルトの名無しさん
09/04/17 21:16:56
裸で冬山に特攻する初心者がいれば「行くな」とも言いたくなるわな

507:デフォルトの名無しさん
09/04/17 21:21:08
>>505
お前英語苦手だろ
英語で書いてあるというだけで凄いって思ってるだろ
海外の人だって「初心者」は Ruby 1.9 を使ってない

508:デフォルトの名無しさん
09/04/17 21:22:39
Vimで入門始めたけど、アホらしくてNetBeans入れてみた

信じられないくらい快適になった

509:デフォルトの名無しさん
09/04/17 21:27:00
>>507
別に得意じゃないけど英語だけですごいなんて思わないだろ。小学生かよ。
新しいことに関して日本のサイトはほとんど引っかからないし、
読んで実際に解決することが多いからそう思う。

あと「Rubyスレ全般」ってわざわざ書いてるんだからちゃんと読んでな。
たった5行なんだからさ。初心者スレに限定してないだろ。

510:デフォルトの名無しさん
09/04/17 21:34:10
日本人はRuby初心者が多い印象がある
外国人の人にとってのRubyは日本人にとってのPythonくらいの「詳しい人向け言語」な感じ

511:デフォルトの名無しさん
09/04/17 21:48:53
ruby-talk読んでるが、初心者らしいというかほほえましい質問が半分くらい(たいかん)

512:デフォルトの名無しさん
09/04/17 22:42:31
詳しい人はこんなところこないと思うよ
前にmswinの人がキレてたじゃん
わざわざ顔出して見ず知らずのしかも自分の足下にも及ばないようなやつに、
口汚くレスされたりしてストレスためる必要ないだろ
あと日本のRuby好きはRubyで何か作るというよりも、メンテナとかをやるのが好きなのかもね

513:デフォルトの名無しさん
09/04/18 01:24:40
ゴルフやってるんじゃねーの


514:デフォルトの名無しさん
09/04/18 11:16:09
month = 4
などの数字が入ってるとき、これを to_sなどで
"04"という風に変換したいんですが、どうすればいいですか?
month = 11
のときは、"11"です。
どうかお願いします。


515:デフォルトの名無しさん
09/04/18 11:23:44
'%02d' % 2 => "02"
'%02d' % 11 => "11"

516:デフォルトの名無しさん
09/04/18 12:06:19
もしくは

$ irb
irb(main):001:0> sprintf("%02d", 4)
=> "04"
irb(main):002:0> sprintf("%02d", 11)
=> "11"

517:デフォルトの名無しさん
09/04/18 12:53:26
MySQLをDBIを介して使おうとしているのですが、
テーブル名一覧を取得する方法をお教えいただけないでしょうか?

dbh = DBI..connect("dbi:Mysql:test:localhost","user","password")
table_names = dbh.execute("SHOW TABLES")
p table_names

とやると全然違うものが出力されてしまいます。
すいませんが、お教えいただけますでしょうか?

518:デフォルトの名無しさん
09/04/18 13:32:41
聞くときだけは丁寧だな。がんばれよw

519:517
09/04/18 16:44:37
自己レスです。

結局DBIを介して行う方法はわからなかったので、Ruby/MySQLで接続して行いました。
require "mysql"

dbh = Mysql::new("localhost","username","password")
dbh.query("use database")
p dbh.list_tables

これで取得できそうです。

520:デフォルトの名無しさん
09/04/18 19:34:20
FreeBSD 7.1-RELEASE-p4 で irb 使ってます
Delete キーを押すと ~ が表示されるんですが、同じような症状をさくっと治したという方はいませんでしょか
csh 上では普通に後ろの文字が消えます

521:デフォルトの名無しさん
09/04/18 20:26:40
端末は何を使っとるん?

522:デフォルトの名無しさん
09/04/18 20:37:48
ええと、アプリケーションは Windows 上の PuTTY で、端末文字列は xterm-color 、
csh から bash を起動して C-v したあとに Delete キーを押すと ^[[3~ が表示されてます(csh 上ではどうやるんだろう?)
screen 等は(まだ)使ってません
接続先は具体的にはさくらインターネットのレンタルサーバです
なんか Ruby あんま関係ないような気がひしひしとしてます

523:デフォルトの名無しさん
09/04/18 20:43:38
irb を起動するとキー操作の動作が違う、という場合はいちおう Ruby スレの範疇だと思う
まあ、irb 自体が独自に何かやってるわけじゃないけどさ

524:デフォルトの名無しさん
09/04/18 21:22:16
>>522
自分もさくらのレン鯖契約しているのでやってみた。
ログインシェルが csh なので、bash にしたあとで irb 起動してみたけど、
C-v したあとだったら delete キーを押すと再現したけど、
C^v しなければ、irb のプロンプト中に delete キーを押したら、ちゃんとカーソル位置の文字が消えたよ

C-v って何のためにやっているの?

525:デフォルトの名無しさん
09/04/18 21:57:44
C-vは、つぎの入力文字を視覚的に表示する機能では?


526:521
09/04/19 00:31:07
>>525
C-v って vi のと同じように、次の入力をキーコードそのまま入力する機能だと思う。
PuTTY が Delete で吐くキーコードが 1b 5b 33 7e ってことだよね。

FreeBSD 7.1-RELEASE-p4 & PuTTY 0.60 ごった煮版 2007年8月6日版だけど、
カーソル位置の文字が消えた。

もし Readline を入れてなければ入れて、
それでダメなら ~/.inputrc に↓コレ書いてみて。

"\e[3~": delete-char

527:デフォルトの名無しさん
09/04/19 02:37:16
RubyのDBIを使おうとしているのですが、
$ irb
irb(main):001:0> require 'dbi'
=> true
irb(main):002:0> DBI.connect('dbi:mysql:test','root','root00')
DBI::InterfaceError: Could not load driver (undefined local variable or method `e' for DBI:Module)
from /usr/local/lib/site_ruby/1.8/dbi.rb:312:in `load_driver'
from /usr/local/lib/site_ruby/1.8/dbi.rb:154:in `_get_full_driver'
from /usr/local/lib/site_ruby/1.8/dbi.rb:139:in `connect'
from (irb):2
となってしまい、うまくコネクトできません。ドライバはインストールしたつもりなのですが、
何か間違ってるでしょうか?

528:527
09/04/19 02:50:31
mysql-ruby-2.8.1.tar.gz
をインストールしたらできました。
DBIだけじゃなくて、Ruby/Mysqlのドライバもインストールしないとだめなんですね。
失礼しやした。


529:464
09/04/19 08:50:34
連投規制で書き込めなかった

>>464
> autotestも標準で spec/以下 と lib/を関連付けて見てくれる。
は、厳密には間違いで、rspecに含まれる autotest用のプラグイン?が spec/とlib/を関連付けてみてくれる

>>469-471
spec_helper.rb(か、もしくはそこからrequrieする.rb)内でshare_asで定義して、includeするとか

530:デフォルトの名無しさん
09/04/20 11:08:49
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]を使用しています
open("|")(I/Oパイプ付)で起動した外部プロセスを強制終了する事ってできますか?
外部コマンドの結果でその後の動作を変えるようなことをしていますが
大体の場合全ての結果を受け取らずとも判定が出来るので
判定が出来た時点で外部コマンドを強制終了して判定にかかる時間を短縮したいです

531:デフォルトの名無しさん
09/04/20 11:09:51
>>530
適当にシグナル送ればいいんじゃね

532:デフォルトの名無しさん
09/04/20 13:28:18
>>530
IO#pid で外部コマンドの pid が取れるみたいね。あとは >>531 の通りで。

533:デフォルトの名無しさん
09/04/20 17:25:24
UTF8のBOMを含むStringからBOMを取り除く方法は?

534:デフォルトの名無しさん
09/04/20 17:38:35
>>533
toutf8

535:デフォルトの名無しさん
09/04/20 17:41:57
iirb> require 'kconv'
irb> text = File.open('test.txt'){|f| f.read}
=> "\357\273\277test\ntest\ntest\n"
irb> text.toutf8
=> "test\ntest\ntest\n"

まあ、ある意味盲点ではあるな

536:デフォルトの名無しさん
09/04/20 18:05:57
盲点ってかただの副作用では
そういうのこそ、メソッドを用意すればいいのに

537:デフォルトの名無しさん
09/04/20 18:11:30
>>536
nkf -w8 はBOM を除去する

538:デフォルトの名無しさん
09/04/20 18:18:58
というよりは、 BOM 無し UTF-8 を出力する、だね

539:デフォルトの名無しさん
09/04/20 18:21:47
BOMについては特につけることも取ることもしない、というスタンスなんだっけか

540:デフォルトの名無しさん
09/04/20 18:35:22
.toutf8もNKFも、余計な変換をしそうで怖いです。
やりたいのはBOMを除くことだけで、変換とかいっさい必要ないんですが。

あと、BOMを含むかどうかの判定方法もお願いします。
今は str.unpack('H6').first == "efbbbf" としてるんですけど、どう考えても頭悪い方法です。


541:デフォルトの名無しさん
09/04/20 18:54:51
BOM = "\357\273\277"
str[0,3] = "" if str[0,3] == BOM
str.sub(/\A#{BOM}/, "")

こういうのでいいんじゃない?

542:デフォルトの名無しさん
09/04/20 18:58:20
str.sub!(/\A\xEF\xBB\xBF/, '')
あたりで

543:デフォルトの名無しさん
09/04/20 19:00:35
Ruby 1.8.7以降だとString#start_with?ってのがあるからそれで判定しても

544:デフォルトの名無しさん
09/04/20 22:53:34
自分でString#bom?とか適当なメソッドを定義すればいい
表面上スマートに見えても内部は泥臭いなんて当たり前

545:530
09/04/21 00:17:20
>>531-532
レスありがとうございます
やってみました…が、外部プロセスの実行が終了したあとにI/Oパイプが開いている気が…
io.each_lineで読み出し中にProcess.kill(9, io.pid)しても実行時間が変わりません
仕様かな…

546:デフォルトの名無しさん
09/04/21 01:13:24
>>545
io.closeするだけで良いんじゃね?

547:デフォルトの名無しさん
09/04/21 10:33:13
require したファイルの一覧って取得できますか

548:デフォルトの名無しさん
09/04/21 10:42:06
自己レスですが
>>547
$LOADED_FEATURES というのがあるらしい。
マニュアルは読んでみるものですね。

549:464
09/04/21 12:39:37
riに失敗してしまうのですが、これはどのようなエラーでしょうか?
回避する方法はありませんでしょうか?

> ri String#lines
(ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:532:in `lookup_ancestor': undefined method `+' for nil:NilClass (NoMethodError)
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:610:in `run'
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:605:in `loop'
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:605:in `run'
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:588:in `each'
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:588:in `run'
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:311:in `run'
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/bin/ri:5
from (ruby installed directory)/bin/ri:19:in `load'
from (ruby installed directory)/bin/ri:19
> ri --version
ri 2.2.0
>ruby --version
ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32]

550:549
09/04/21 12:46:51
名前の464はミスです。キニシナイでくだしあ

551:デフォルトの名無しさん
09/04/21 13:06:36
gemで自分でriを入れたのか。
それを消せばいいんじゃね?

552:デフォルトの名無しさん
09/04/21 21:28:24
1年前のスクリプトを眺める

…ライブラリそのものをナチュラルに継承すんな、っていうか重要メソッド上書きすんな
ライブラリのオブジェクトをインスタンス変数に保持してメソッドを依頼するラッパー操作クラス作るだけで十分じゃねーか

来年には「この改造無駄だったなー」と思えるようになるのだろうか

553:デフォルトの名無しさん
09/04/21 22:58:43
家庭用プログラムのテスト駆動開発とかなんかそのへんでしつもん

a というメソッドを作ってる最中に、その中の特定の処理を a' というメソッドに分けたとして、

def a
 aaaaa
 bbbbb
 ccccc
 ...

 ↓

def a'
 bbbbb
 ccccc
end
def a
 aaaaa
 a'
 .....

その a' についてのテスト項目は作るほうがいい?
それとも、 a についてのテストをちょこっと詳しくする程度で、a が完動したことをもって「隠して」おくのが普通?

554:デフォルトの名無しさん
09/04/21 23:35:11
「普通」がまだ決まってない。
テストしろ、とかpublicなメソッドのテストがパスしてるんだからおkとか、
モックとかスタブとか使えば、とか。

555:デフォルトの名無しさん
09/04/22 01:07:07
privateなメソッドはそもそもテストできないようなテストフレームワークもあるような?

556:デフォルトの名無しさん
09/04/22 01:11:35
テストしまくり中はメソッドのアクセス制御は敢えてしないと思うんだが
ユーザーからの隠蔽だけが目的の場合(つまり大多数の場合)はふつうにめんどくさいじゃん?

557:デフォルトの名無しさん
09/04/22 01:18:51
>>553
基本的には作らないが、他のメソッドからも使う(ような気がする)場合は仕様書的にspecファイルに書く
return するものがたくさんあるようなメソッドにうっかり育ててしまった場合もやっぱ書く

最初は全部書いてたんだけど、describe がメソッド 1個に対応するような使い方をしてると引数とかで正直非常にめんどい

558:549
09/04/22 07:43:36
>>550
うは。確かにgemのrdocに入っているんですね。
gem update rdocしたらエラーでなくなった!!

でも…

> ri String#lines
Updating ri class cache with 5126 classes...
Nothing known about String#lines

うーん。こういうことって普通にあるの?

gemのrdocのriが駄目かと思ってrdoc消してみたら、

>ri String#lines
(ruby directory)/lib/ruby/site_ruby/1.8/rubygems.rb:805:in `report_
activate_error': Could not find RubyGem rdoc (>= 0) (Gem::LoadError)
from (ruby directory)/lib/ruby/site_ruby/1.8/rubygems.rb:24
3:in `activate'
from (ruby directory)/lib/ruby/site_ruby/1.8/rubygems.rb:50
:in `gem'
from (ruby directory)/bin/ri:18

orz

559:デフォルトの名無しさん
09/04/22 10:22:13
インスタンス変数へのアクセスと、クラス変数へのアクセスと、ローカル変数へのアクセスを
速い順にならべるとどうなりますか。
クラス変数へのアクセスはだいぶ遅そうだとは思いますが、インスタンス変数とローカル変数へのアクセスにどのくらい違いがあるのか知りたいです。

560:デフォルトの名無しさん
09/04/22 10:27:08
>>559
これが速度に影響するような用途のプログラムであるなら、Rubyで作らないほうがよい
ブロックつきメソッドとか使われてたら奇声上げてキーボード投げつけるレベル

ちなみに

     アクセス遅い                               アクセス速い
 クラス変数 > インスタンス変数 > ブロック外のローカル変数 > ブロック内のローカル変数

こんな順番だったと思うが、どっかに言及があったはず

561:デフォルトの名無しさん
09/04/22 10:38:03
tips: Hash[:symbol] > Struct > Hash["string"] >>>>>(越えられない壁) >>>> OpenStruct

562:デフォルトの名無しさん
09/04/22 12:57:25
PHPのuniqid() に相当する関数やライブラリはありますか。
uniqid()とはこんなやつです。
URLリンク(php.benscom.com)

563:デフォルトの名無しさん
09/04/22 13:05:03
>>562
例えば、これでどう?

require "securerandom"
p SecureRandom.uuid

564:デフォルトの名無しさん
09/04/22 13:09:46
テンプレに入れてもよさそうなRuby関連Googleブック検索
ruby - Google ブック検索
URLリンク(books.google.co.jp)

565:デフォルトの名無しさん
09/04/22 13:14:49
def uniqid(prefix = "", more_entropy = false)
id = "%s%x" % [prefix, Time.now.to_f*1_000_000]
id << ".%.8d" % rand(100_000_000) if more_entropy
id
end


566:デフォルトの名無しさん
09/04/22 18:23:16
>>563
SecureRandom.uuidは1.8.7じゃ使えないからなぁ。


require "rubygems"
require "uuidtools"
p UUID.timestamp_create


567:デフォルトの名無しさん
09/04/22 20:21:26
>>564
「赤毛のアン」が検出されるんだが・・・?

568:デフォルトの名無しさん
09/04/22 22:18:55
Rubyも赤いからいいんじゃない?

569:デフォルトの名無しさん
09/04/23 08:38:48
どこでいいからまからんでここで聞きます

下記のようなプレゼンの外見のテンプレートがRuby界隈では最近流行っているのですが、
このプレゼンはどのようなツールもしくは、テンプレートで作られているのでしょうか?
Sinatraで鼻歌まじりのWeb開発
URLリンク(www.slideshare.net)

570:デフォルトの名無しさん
09/04/23 09:47:29
そんな「Ruby界隈」は知らない。

571:デフォルトの名無しさん
09/04/23 09:55:18
>>570
気を悪くしたらすいません。
なかなか見やすいと感じたので気になっているのです。

572:デフォルトの名無しさん
09/04/23 09:59:30
>>571
気を悪くしたんじゃなくて、それが流行ってるのは「Ruby界隈」と言えるほど広い世界でもないし中心に近くもないだろ、と。

で、その辺の人たちはKeynote使ってるんじゃないの。

573:デフォルトの名無しさん
09/04/23 10:17:56
もしかして、「高橋メソッド」のことを言ってるとか?

574:デフォルトの名無しさん
09/04/23 11:58:51
>>569
このプレゼンはおもしろかった。

このなかで Rails は「ちょっとしたことをやるには大げさ」とあるが、
自分は Java → Ruby ときたけど、Java の web フレームワークに比べれば
Rails はずっと軽くて楽だと感じる。

この sinatra というのは、流行っているんですか?

575:デフォルトの名無しさん
09/04/23 12:08:02
最近名前聞くねぇ。
使ったことないというか、そっち方面は全然手がけないんだが。

576:デフォルトの名無しさん
09/04/23 12:23:36
Winでファイルのアーカイブフラグが立っているかを判定したり
フラグをセットしたりするのってどうやるの?

577:デフォルトの名無しさん
09/04/23 12:49:38
>>576
File::Stat に見当たらないということはサポートされてないのかなあ
自分には Win32API の GetFileAttribute/SetFileAttribute を呼ぶくらいしか思いつかない


578:デフォルトの名無しさん
09/04/23 13:25:25
標準では無いよ
gemのWindowsファイルシステム操作ライブラリで見た覚えがあるので適当なの使え

579:デフォルトの名無しさん
09/04/23 14:43:45
win32-fileにあったと思う


580:デフォルトの名無しさん
09/04/23 16:05:39
opensslライブラリのマニュアルを読んでいるんですけど
URLリンク(www.ruby-lang.org)
pkcs5_keyivgen('str') で生成したキーを取り出すことってできないんでしょうか。

581:デフォルトの名無しさん
09/04/23 17:29:42
rubyscript2exeが動かなくなってしまいました。非常に困っています。
何か解決策はありませんでしょうか?

> rubyscript2exe test.rb
Tracing test ...
Gathering files...
c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/require2lib.rb:60:in `gatherlibs':
undefined method `list' for Gem::Specification:Class (NoMethodError)
from c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/require2lib.rb:30
from test.rb:1
hellow
Couldn't execute this command (rc=256):
d:\software\ruby\bin\ruby -r 'enumerator.so' -r 'rubygems/rubygems_version.rb' -r 'rubygems/defaults.rb'
-r 'thread.so' -r 'thread.rb' -r 'etc.so' -r 'rbconfig.rb' -r 'rubygems/exceptions.rb' -r 'rubygems/requirement.rb'
-r 'rubygems/version.rb' -r 'rubygems/dependency.rb' -r 'rubygems/gem_path_searcher.rb' -r 'rubygems/user_interaction.rb'
-r 'rubygems/platform.rb' -r 'rubygems/specification.rb' -r 'rubygems/source_index.rb' -r 'rubygems/builder.rb'
-r 'stringio.so' -r 'yaml/error.rb' -r 'syck.so' -r 'yaml/ypath.rb' -r 'yaml/basenode.rb' -r 'yaml/syck.rb' -r 'yaml/tag.rb'
-r 'yaml/stream.rb' -r 'yaml/constants.rb' -r 'rational.rb' -r 'date/format.rb' -r 'date.rb' -r 'yaml/rubytypes.rb'
-r 'yaml/types.rb' -r 'yaml.rb' -r 'Win32API.so' -r 'rubygems/config_file.rb' -r 'rubygems/custom_require.rb' -r 'fileutils.rb'
-r 'rubygems.rb' -r 'ubygems.rb' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe'
-I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1'
-I 'd:/software/ruby/lib/ruby/gems/1.8/gems/rubyscript2exe-0.5.3/bin'
-I 'd:/software/ruby/lib/ruby/gems/1.8/gems/rubyscript2exe-0.5.3/lib'

582:デフォルトの名無しさん
09/04/23 17:30:30
-I 'd:/software/ruby/lib/ruby/site_ruby/1.8' -I 'd:/software/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt'
-I 'd:/software/ruby/lib/ruby/site_ruby' -I 'd:/software/ruby/lib/ruby/vendor_ruby/1.8'
-I 'd:/software/ruby/lib/ruby/vendor_ruby/1.8/i386-msvcrt' -I 'd:/software/ruby/lib/ruby/vendor_ruby'
-I 'd:/software/ruby/lib/ruby/1.8' -I 'd:/software/ruby/lib/ruby/1.8/i386-mswin32'
-I '.' -I 'd:/home/test/ruby/' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe'
-I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/lib' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe'
-I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/lib' -r 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/require2lib.rb' 'test.rb'
Stopped.

> ruby --version
ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32]
> gem --version
1.3.2

583:デフォルトの名無しさん
09/04/23 18:55:38
undefined method `list' for Gem::Specification:Class (NoMethodError)

Gem::Specification.listメソッドはgem 1.3.1になら存在する。
1.3.2では削除されたようだ。
gatherlibsを修正するか、gemコマンドをダウングレードする。
そしてrubyscript2exeの開発元に連絡をする。


584:デフォルトの名無しさん
09/04/23 19:26:02
>>583
ありがとう。
どうやらそのようですね。RubyGems1.3.2のスレッドでも話題になってたみたいです。

RubyGems 1.3.2 - ruby-talk-google | Google グループ
URLリンク(groups.google.com)

そこで紹介されていた、Ocraというrubyscript2exeみたいなパッカーがあったので試してみています(windowsのみですが)
larsch's ocra at master - GitHub
URLリンク(github.com)

Ocraそこそこコンパクトな上に、起動が早くてよさげです。
rubyscript2exeは今まで何でもうごいてたので、同じようにスクリプトが動くか検証してみます。

585:デフォルトの名無しさん
09/04/23 19:28:40
x Ocraそこそこコンパクトな上に、起動が早くてよさげです。
o Ocraそこそこコンパクトな上に、exe化したプログラムの起動が早くてよさげです

586:デフォルトの名無しさん
09/04/24 23:45:20
どうして、ruby -pの後のgsubはレシーバが省略できるのですか?
いつも使ってて便利だなあと思ってるけど不思議に思ってます。

ruby -p -i.bak -e'gsub(/hoge/, "fuga")' data.out



587:デフォルトの名無しさん
09/04/25 00:17:28
>>586
関数的メソッド gsub が呼ばれているだけだ(こいつは $_ をレシーバとして扱う)
String#gsub が直接ワンライナー用にいじられて呼ばれているとかそういうわけではない

588:デフォルトの名無しさん
09/04/25 08:35:56
class SomeClass
 @@message = "call myself Mr.#{@name}!"
 def initialize(name)
  @name = name
 end
end

このまま@@messageを参照すると、@nameが未定義の段階で定義しているため出力は"call myself Mr.!"となります。
このように後で@nameに値が入ったとき(あるいは変更されたとき)
@@messageを参照する段階で@nameを再度当てはめるとしたら、どのように書けばよいでしょうか。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5385日前に更新/278 KB
担当:undef