Ruby 初心者スレッド ..
[2ch|▼Menu]
384:デフォルトの名無しさん
09/12/23 13:52:22
>>382
テストが通らないタイミングでファイルを保存したりしないの?
というか編集途中で保存し辛くなりじゃん

385:デフォルトの名無しさん
09/12/23 13:54:01
なるじゃん

386:デフォルトの名無しさん
09/12/23 14:12:02
ファイルいっこのテスト方法がないわけじゃなかろう
autotestを使うかどうかとはまた別の議論だと思う

387:デフォルトの名無しさん
09/12/23 15:17:10
>>382
コードを保存したいタイミングと、テストを走らせたいタイミングは別じゃね?
エディタからテストを実行させられればそれでいいけどなあ。
わざわざ保存したときに勝手にテストが走ってほしくないよ。

388:デフォルトの名無しさん
09/12/23 18:03:22
かりに毎回毎回コマンドラインからテストするとしても
シェルの履歴ぐらい使うだろう。


389:デフォルトの名無しさん
09/12/23 18:27:27
秀丸とかサクラエディタとか外部コマンドを
実行できるテキストエディタを使うがよろし。
俺はVim使ってるけど。

390:デフォルトの名無しさん
09/12/23 18:36:19
俺はタブ機能付きの端末エミュレータ使って
右端のタブをテスト用に使ってる
タブ切り替えにキーを割り当ててやるとかなり快適だ

同じ用途で GNU Screen とか使ってる人もいるのでは?

391:デフォルトの名無しさん
09/12/23 19:41:16
auto-save-buffersつかってるとautotestは使えない

392:デフォルトの名無しさん
09/12/23 21:51:25
>>387
そうかー、その品は人それぞれだな。

autotest連携で結果をSnarl(今ならGrawlか?)で通知出したり、サウンド出したりしてるけど
けっこう快適よ?
ただ、coLinuxで動かすとその辺の連携がしにくくて困る

さらに、AutoHotKeyで保存キー入力と同時にブラウザリロードとかもやってる。

393:デフォルトの名無しさん
09/12/24 01:40:48
自動保存+すきあらば無意識で手動保存してるから、
保存とか意識したことがないなー。


394:デフォルトの名無しさん
09/12/24 09:39:55
warning: Insecure world writable dir /home in PATH, mode 040777
という警告がでて困ってます。
この警告だけを出さないようにする方法があれば教えてください。

home のパーミッションが 777 なのがおかしい!といわれればそうなんですけど、
下請けにはそんなことすら変更する権限がないんです。



395:デフォルトの名無しさん
09/12/24 09:47:09
>>394
知らんよ
RailsはRailsスレで

396:デフォルトの名無しさん
09/12/24 10:47:41
>>394
環境を詳しく

もしRailsなら権限くれっていえ。まともに開発できんから

397:デフォルトの名無しさん
09/12/24 11:31:38
>>394
ENV['PATH']から /home を抜け。


398:デフォルトの名無しさん
09/12/24 11:33:56
ENV['PATH']つーか、rubyを実行する前だからシェルの環境変数PATHね。


399:デフォルトの名無しさん
09/12/24 11:52:12
>>395
なぜRails?

>>396
環境はlinux 2.6.9-89.EL, ruby 1.8.7-p174です

>>397
$PATHには/homeがないけど、/home/username/binがあります。
これを除くことはできないので、どうしたもんか困ってます。



400:デフォルトの名無しさん
09/12/24 12:28:44
フルパスで実行するようにすれば除けるんじゃないの?


401:デフォルトの名無しさん
09/12/24 12:32:16
あくまでrubyに伝わるPATHだけ変わればいいので、

* コマンドの環境だけ変える。
PATH=/usr/bin:/bin(などなど) ruby 引数
とか

* 一度変えて戻す
OLD_PATH=$PATH
PATH=/usr/bin:/bin(などなど)
ruby 引数
PATH=$OLD_PATH
とか

* サブシェル内で変える
(
PATH=....
ruby
)

とかでもいい。


402:デフォルトの名無しさん
09/12/24 16:39:54
RubyGemsで依存関係を調べる方法ないですか?
gem dependency を使ってみているんですがうまくいきません。

$ gem dependency mechanize -v "0.9.3" --remote
Gem mechanize-0.9.3
nokogiri (>= 1.2.1, runtime)
hoe (>= 1.12.2, development)

$ gem dependency mechanize -v "0.9.0" --remote
No gems found matching mechanize (= 0.9.0)

$ gem dependency mechanize -v "<0.9.0" --remote
Gem mechanized_session-0.0.2
mechanize (>= 0.9.3, runtime)
hoe (>= 2.3.3, development)

何がやりたいかというとmechanizeでnokogiri非依存のバージョンを探したいのです。

403:デフォルトの名無しさん
09/12/24 16:56:21
>>402
WWW::Mechanize.html_parser = Hpricot

404:デフォルトの名無しさん
09/12/24 17:04:10
>>402
libxml2 に依存したくないというのなら>>403
Nokogiri のインストール自体を dependency 経由で行って欲しくないというのなら、Mechanize 0.8.4 かそれ以前が必要

405:402
09/12/24 17:13:20
即レスありがとうございます。

>>403
あー、いや、Bundlerで利用しようとしておりまして、
実行環境ではNokogiriが動かないため依存段階そのものから外したいのです。

# 実際はappengine-jrubyでmechanizeを使いたいという難儀なアレなのです
# jruby版Nokogiriはffi依存のせいでappengineでは動かんのですわ・・・
appengine-jruby - Project Hosting on Google Code
URLリンク(code.google.com)

>>404
ありがたい
0.8.4ですね、試してみます。

後学のために聞きたいのですが、こういうのってどうやって調べられるもんなんでしょうか?
以前はgemコマンドでgemのパッケージ時の設定を見る方法があったような気がしたのですが、どこいったんでしょう?

406:402
09/12/24 17:16:34
>>405 の前半の説明が足りないので補足。
mechanize 0.9.3では >>403したいところなんですが、
require 'mechanize'
するだけでffiねーぞゴラァ(appengine版のjrubyでは含まれてないためらしいです。pure java版Nokogiriが望まれます)
のエラーがでてしまうのです。

407:デフォルトの名無しさん
09/12/24 17:20:09
>>405
何もしてない
賞味3分の力技
add_dependency から Nokogiri が消えるまで mechanize.gemspec の github 履歴を直接調べて遡った

408:デフォルトの名無しさん
09/12/24 18:55:35
参考までに聞きたいのですが、
長くなり過ぎたメソッドチェーンの途中に改行を入れる場合、
皆さんはどこで改行するのが適切だと思いますか?

1) ピリオドの後に \
value = this.is.a.\
very.long.method.chain

2) ピリオドの前に \
value = this.is.a\
.very.long.method.chain

3) そもそも途中で改行しない

value = this.is.a
value = value.very.long.method.chain


409:デフォルトの名無しさん
09/12/24 19:03:30
>>408
長くなりすぎたと感じる時点で「よくないコードの匂い」なので、リファクタリング開始

410:デフォルトの名無しさん
09/12/24 19:13:53
>>408
メソッドチェーンでは改行は入れない
今更80文字制限などとは言わないが、メソッドチェーンで長い場合は途中変数で分ける
該当するとすれば3

411:408
09/12/24 19:16:52
>>409
長くなり過ぎた場合という表現にちょっと語弊があったかも知れません。
実際にはメソッドのブロック付き呼び出しが2〜3続くような場合で
どうしても1行には収まらない場合、です。例をあげると

files = Dir.glob("**/*.rb").select {|file| ... }.reject {|file| ... }.map {|file| ... }

のようなパターンです。


412:402
09/12/24 19:18:31
>>407
ΩΩΩな、なんだってー。恐れ入りました。そんな手がw

gem dependencyやgem specコマンドは--remoteのときには最新版からしかとれないんですね。
一旦gemをインスコしたらOK見られるようですが・・・

413:デフォルトの名無しさん
09/12/24 19:19:43
>>408 >>411
files = Dir.glob("**/*.rb").select {|file| ... }.
    reject {|file| ... }.map {|file| ... }

って俺はやってるな

414:デフォルトの名無しさん
09/12/24 19:20:46
>>410
> メソッドチェーンでは改行は入れない

>>411 であげたようなパターンでもそうなのですか?
自分はああいうパターンだとピリオドの後で改行しちゃうのですが、
一般的には推奨されない(マナーの悪い)書き方なのでしょうか


415:408
09/12/24 19:24:34
>>413
ピリオドの後は \ なくてもいいんですよね。
自分の場合意図的な改行であることを明示するために \ を付けてます。

というか、>>411 の例は最後の map が意味的におかしいですね、しまったorz

416:デフォルトの名無しさん
09/12/24 19:29:58
files = Dir.glob("**/*.rb").select{|file|
      ...
    }.reject{|file|
      ...
    }.map{|file|
      ...
    }

417:デフォルトの名無しさん
09/12/24 21:32:51
ワンライナー書いてるならともかく、どっかで区切れよと
なぜそんなにつなぎまくるのかと

418:デフォルトの名無しさん
09/12/24 22:41:13
>>417
自分の場合はつなぐというより、
つながっていくという感じでついつい長くなってしまうw
返値を無駄にしたくないというか

変数の名前を processed_values とかにした場合も名前に引きずられて
途中の状態を入れたくないという雑念が生じ、無理してでも一連のチェーンで書いちゃう


419:デフォルトの名無しさん
09/12/25 01:09:13
Ping打ちたいんだけどどう書くの?

420:デフォルトの名無しさん
09/12/25 01:25:21
>>419
URLリンク(www.sakalab.net)

421:デフォルトの名無しさん
09/12/25 01:35:21
俺もそれ出そうかと思ったけど、ICMP使わないんだよな

422:デフォルトの名無しさん
09/12/25 01:38:51
わかりやすくていいじゃん

423:デフォルトの名無しさん
09/12/25 05:59:43
files = Dir.glob("**/*.rb")
files.reject! {|file| ... }
files.map! {|file| ... }

424:デフォルトの名無しさん
09/12/25 09:08:05
>>423みたいに例示依存の回答する人なんなの

425:デフォルトの名無しさん
09/12/25 09:21:57
実際には存在しないメソッドを使って質問したほうがいいな

426:デフォルトの名無しさん
09/12/25 09:54:59
別にいいんじゃない?
破壊的メソッドが使える状況なのに気づかなかった初心者がいてもおかしくないし
役に立たないならスルーすればいい
回答者にエスパーを要求するっていうのはそういうことだと思う

427:デフォルトの名無しさん
09/12/25 12:03:27
1.9 だと メソッドのピリオド前でも改行できるようになった
複数行のメソッドチェーンのピリオド位置をそろえられるらしい

if とか class とか直後に識別子や式が必須のところは改行しても行が継続するとか
そういう行継続のルールってマニュアルあるの?


428:デフォルトの名無しさん
09/12/25 12:16:41
従来のルール
「改行までの箇所を読んで完結していると見なされる(パースできる)ことがないなら改行OK」
に追加されたのは「メソッド呼び出しのピリオドの前もOK」だけのはず。



429:デフォルトの名無しさん
09/12/25 12:18:40
あれ、>>428 のルールだけでは
class Hoge
で改行が許されるのは説明できないのか。


430:デフォルトの名無しさん
09/12/25 15:44:18
>>429
ん? 説明できてるように思うけど
class Hoge って end で閉じるまで完結しないでしょ

431:デフォルトの名無しさん
09/12/25 16:16:30
1.8.7p174

puts 1+
2
これは3と出る。+がまだ完結していないから2までがまとまって解釈される。

puts(1+
+2)
同じく3。

puts 1
+2
これは1までで完結しているから1と出て、+2は単項演算して捨てられる。

puts(1
+2)
これは unexpected tINTEGER, expecting ')'
次の行まで見て完結させてくれないのはどうして?




432:デフォルトの名無しさん
09/12/25 16:22:47
パーサをそんなにいじめるなよ

433:デフォルトの名無しさん
09/12/25 16:57:33
>>431
パーサには puts (1 2) と見えてる(+ は単項演算子と解釈されてる)

puts (1
+ 2)
だといけるかなと思ったが syntax error, unexpected '+', expecting ')' だった
ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux]


434:デフォルトの名無しさん
09/12/25 19:49:28
> puts 1
> +2
> これは1までで完結しているから1と出て、+2は単項演算して捨てられる。

↑ここまできたら

> puts(1
> +2)

これは駄目ってわかりそうなもんだろw

435:デフォルトの名無しさん
09/12/25 20:00:39
>>434
kwsk

436:デフォルトの名無しさん
09/12/25 20:05:56
puts(1\
+2)

437:デフォルトの名無しさん
09/12/25 20:08:58
>>434
どうして?
>>436
解決法を求めてるわけじゃないぜ。


438:デフォルトの名無しさん
09/12/25 20:30:44
()の構文は(式)。
(1 と書くと1は完結した式と解釈され、次の行には残りの)しか書けない
ってことでok?

439:デフォルトの名無しさん
09/12/25 20:42:13
ずいぶんしみったれてるな。
'('が出て来たら')'の直前までを式と解釈してくれても良さそうなもんだが

440:デフォルトの名無しさん
09/12/25 21:15:20
Rubyのパーサは(人間にすると)曖昧な解釈だからなw

>>437
puts 1
+2
が駄目なので、演算子を行末におかない場合は次行と連結されないため、式として認識しない、までは認識できるだろう。

なので、次の
puts (1
の時点で次行とは連結されないでその行までで解釈される、と考えられるので、
閉じ括弧がその行にないのでエラーとなる、と

そういうふうに頭がさっと回らない、ということならばあなたがRubyに慣れていないか、
もしくは俺が長い行を複数行に分割するのに慣れすぎているのでそう感じてしまうだけかw

441:デフォルトの名無しさん
09/12/25 21:24:09
puts((3
+ 4)) # => 4
とかRubyって面白いね

442:デフォルトの名無しさん
09/12/25 21:29:45
もろくも崩れ去った俺(=>>438)の推理orz
>>441はどういうことなの?


443:デフォルトの名無しさん
09/12/25 21:42:32
えっ?
ここ初心者スレなんですけど

444:デフォルトの名無しさん
09/12/25 23:05:02
>>443
初心者にも有益な話題じゃない?
式が完結してしまうところで不用意に改行して構文エラーも出なくて
なんでうまく動かないんだみたいな落とし穴を回避するにはこういう知識も必要

445:デフォルトの名無しさん
09/12/25 23:06:30
バッドノウハウに近いと思う
改行が有効な個々の場合を記憶する理由はない

446:デフォルトの名無しさん
09/12/25 23:08:31
初心者は構文解析何それおいしいのだし
妙なところで改行打つような真似もしないだろう

447:デフォルトの名無しさん
09/12/25 23:12:13
結論 とても長い式文でもない限り途中で改行すると見づらいし誤作動の原因になりかねないからやめれ。

448:デフォルトの名無しさん
09/12/25 23:14:12
メソッドチェーンはとても長い式文に入りますか?

449:デフォルトの名無しさん
09/12/25 23:54:41
>>441
puts((3;+4))
と同じ

450:デフォルトの名無しさん
09/12/26 00:29:37
>>444
>>443>>440に対して
初心者スレで何で
>そういうふうに頭がさっと回らない、ということならばあなたがRubyに慣れていないか、
なこと言うのってことだ

451:デフォルトの名無しさん
09/12/26 00:34:38
puts (3;+4) はエラーで
puts((3;+4))は通るのは何で?

452:デフォルトの名無しさん
09/12/26 02:20:30
前者、おそらく”(”がメソッド引数の括弧だと読まれている
引数部に”;”があるのはおかしいからエラー

後者、(3;+4)は4に等しいから、
puts(4)と同じ。もちろん文法的に正しい

453:デフォルトの名無しさん
09/12/26 02:43:20
なぜこんな仕様にしたし

454:デフォルトの名無しさん
09/12/26 04:56:34
括弧の省略を可能にするため、とマジレス

455:デフォルトの名無しさん
09/12/26 07:52:07
>>451
引数を括る括弧と、式としての括弧は別

456:デフォルトの名無しさん
09/12/26 21:00:18
質問です。
include して使われることが想定されているモジュールを書いているのですが
非公開の下請けメソッドの扱いについて悩んでいます。
include先で名前の衝突が起こらないようにするため、以下の方法を考えたのですが……

1、適当な接頭辞をつける → 衝突はしにくくなるけどしないとは言えないw
2、モジュールメソッドにしちゃう → 非公開じゃなくなるw
3、モジュール内部に Privateモジュールを作り、Private.method でアクセス
→ Privateモジュール自体は非公開にできないけど、includeする側からアクセス
されることはまずないだろう

他にもっとよい方法というか、こういう場合のイディオム、定石のようなものが
あったら教えて欲しいです。

457:デフォルトの名無しさん
09/12/26 22:19:29
>>456
実用上は
>1、適当な接頭辞をつける → 衝突はしにくくなるけどしないとは言えないw
で十分。それでも心配なら接尾辞もつけるといい。
(もちろん衝突しやすい接頭辞は避けてね)

458:456
09/12/27 08:57:11
>>457
わかりました。接頭辞をつけておくことにします。
あまり長すぎるとうるさくなるんで、
アンダースコア+モジュール名を3文字くらいに圧縮したもの ぐらいでいいかな。

459:デフォルトの名無しさん
09/12/27 09:43:27
インスタンスメソッドである必要がないなら非公開にする必要もないと思うんだけど
個人的には3かな、Hoge::Utilsとか

460:デフォルトの名無しさん
09/12/27 11:37:54
>>456
>1、適当な接頭辞をつける → 衝突はしにくくなるけどしないとは言えないw

スクリプト言語は変数の型についてはいいかげんだし、カプセル化についてだけ厳密性を求めてもしょうがないと思う。
もともとそういう言語じゃないんだよ、スクリプト言語は。
接頭辞や接尾辞をつけるだけでは衝突する可能性はゼロにできないけど、実用上は問題ないから、それでよしとしてください。

461:456
09/12/27 17:37:52
>>459
> インスタンスメソッドである必要がないなら非公開にする必要もないと思うんだけど
> 個人的には3かな、Hoge::Utilsとか

Helpers とかもそうですね。
外部から利用しても役に立ちそうなメソッドなら積極的にそうすべきかも

>>460
> カプセル化についてだけ厳密性を求めてもしょうがないと思う。
> もともとそういう言語じゃないんだよ、スクリプト言語は。

そういうもんですか。
サブクラスに対して閉じるアクセス制御って今後もできないんですかね

462:デフォルトの名無しさん
09/12/28 01:40:43
>>461
たぶんRubyでのprivateを勘違いしている。
Javaと違うから、マニュアルを読むことをお勧めする。

463:デフォルトの名無しさん
09/12/28 04:42:17
可視性メモ
URLリンク(www.rubyist.net)

464:デフォルトの名無しさん
09/12/28 06:26:05
>>462
名前の衝突を懸念している時点で勘違いはしてないと思うのだが

465:デフォルトの名無しさん
09/12/28 12:17:10
>>464
「サブクラスに対して閉じるアクセス制御」と言ってる時点で勘違いしてると思う。

466:デフォルトの名無しさん
09/12/28 12:41:29
あればいいのにって話だろ

467:デフォルトの名無しさん
09/12/28 12:45:35
Rubyではアクセス制御はそもそもできない
可視性を決めるだけ

468:デフォルトの名無しさん
09/12/28 16:09:11
>>466
不要です。
以上。
↓はい次の方。

469:デフォルトの名無しさん
09/12/28 16:12:49
↓    本質的にはオープンクラスを諦めないといけない
↓    再オープンできる時点で制御も何もねえよ


470:デフォルトの名無しさん
09/12/28 18:21:24
本質的にはMatzの設計次第

471:デフォルトの名無しさん
09/12/28 20:04:43
サブクラスに上書きされない為にどうしたらいいかって質問なのに
勘違いしてるとか不要とか諦めろとかどーゆー事よ
質問者の方がよっぽどrubyの事を理解してると思うわ

472:デフォルトの名無しさん
09/12/28 20:07:14
Matzに聞いたら、
サブクラスで気をつけれ
っていうに決まってそう

473:デフォルトの名無しさん
09/12/28 20:15:49
>>471
だからシステム的にできねえって
新しいRuby実装を自分で作れば無論可能だが、そういう回答を求めているわけではあるまい

474:デフォルトの名無しさん
09/12/28 20:18:15
>>471
じゃあ、おまいが答えれ

475:デフォルトの名無しさん
09/12/28 20:57:46

set_position x, y, z
get_positionX

みたいなget,set関数を作りました。
setはともかくgetはつけずに

positionX

の方が良いですか。どちらがよりRubyっぽいか教えてください


476:デフォルトの名無しさん
09/12/28 21:00:26
x メソッドや y= メソッドだと都合が悪い?

477:デフォルトの名無しさん
09/12/28 21:06:09
ziki.position = [x,y,z]
puts ziki.position_x

ですか???
そっちの方がRubyっぽいならそれでも良いです

478:デフォルトの名無しさん
09/12/28 21:20:17
混乱してきたので質問を変えます。
AとBについてどちらが良いですか?

A:
(1) my.position = [1,2,3]
(2) my.set_position 1, 2, 3

B:
(1) puts my.position // 配列
(2) puts my.position_x

479:デフォルトの名無しさん
09/12/28 21:39:37
>>478
[x, y, z] の組が頻出なら Struct を使ってもいいかも
Point = Struct.new(:x, :y, :z)
my.position = Point.new(x, y, z)
my.position.x

480:デフォルトの名無しさん
09/12/28 21:48:58
>>478
attr_accessor, attr_writer, attr_reader とかは知ってる?

481:デフォルトの名無しさん
09/12/28 22:07:20
>>479のPointを使って
class My
 attr_reader :position
 def initialize ; @position = Point.new ; end
 def position=(xyz)
  @position.x,@position.y,@position.z = xyz # 要引数チェック
 end
end

my = My.new
my.position = [0,0,0]
pos = my.position
my.position.x = pos.x + 1

482:デフォルトの名無しさん
09/12/28 22:09:56
初心者スレでStruct使うアホは即爆発していいよ

483:478
09/12/28 22:11:56
そんな難しい文法使わないでください。
初心者には理解できません。

484:デフォルトの名無しさん
09/12/28 22:15:23
>>482
お前は永遠に配列の添字アクセスでもやってろ

485:デフォルトの名無しさん
09/12/28 22:23:19
ハッシュで複雑なデータ構造を表現するのは悪らしい。。

486:デフォルトの名無しさん
09/12/28 22:27:43
>>483
>>481 を見て具体的に何が理解できないか書いた方がよいと思われ

487:デフォルトの名無しさん
09/12/29 08:24:31
>>485
Javaの人は引数にハッシュを使うことを理解できません
Struct使う人間の95%がRubyをJavaと勘違いして使っています

488:デフォルトの名無しさん
09/12/29 08:53:28
質問です
[1,2,3] * [2,2,2] = [2,4,6] と書ける裏技無いですか。
ようは2つの配列を要素毎掛け合わせて欲しい

489:デフォルトの名無しさん
09/12/29 09:02:39
>>488
とくにないです

require 'enumerator'
a1 = [1, 2, 3]
a2 = [10, 20, 30]
p a1.enum_with_index.map{|e,i| e*a2[i]} #=> [10, 40, 90]


490:デフォルトの名無しさん
09/12/29 09:04:25
>>488
class Array
 def * other
  m = []
  each_index{|i| m << self[i] * other[i]}
  m
 end
end

裏技だからね。既存の Array#* を使ってるコードがどっかにあって
何が起きても知らないよ。

491:デフォルトの名無しさん
09/12/29 09:36:10
>>487 は x, y, z の組をどう扱うの?


492:488
09/12/29 09:38:30
>>490
いやそれはちょっと……

>>489
うーん、やっぱり無理そうですね。
C++みたいに Array& operator* (const Array& a1, const Array& a2) が定義できると便利なのに

493:デフォルトの名無しさん
09/12/29 12:49:27
a1 = [1, 2, 3]
a2 = [10, 20, 30]

p a1.zip(a2).inject([]){|r,(x,y)| r << x*y}
とか


494:デフォルトの名無しさん
09/12/29 12:53:15
>>491
配列とかでいいんじゃねえの

組として外部に持ち出さなければならないなら
クラスか何か作って名前付けることをそのときに考える

495:デフォルトの名無しさん
09/12/29 16:42:10
eclipseで開発できますか?

496:デフォルトの名無しさん
09/12/29 16:44:38
>>495
そらできる。

497:デフォルトの名無しさん
09/12/29 16:45:55
def foo=
end

と同様に

def foo<<
end

を定義するとコンパイルエラーになるのですが、もしかしてこれはダメなんでしょうか。
その場合はどうすれば???

498:デフォルトの名無しさん
09/12/29 17:07:16
foo= のようなメソッド名は、
obj.foo = ...
のような式のために特別に許されている。
(foo に代入するためには、obj.foo ではなく obj そのものを呼び出す必要があるため)

obj.foo << のような式は、obj.foo の << の呼び出しと解釈されるので、
そういうようなメソッド名はない。

ていうかどういうことがしたいわけ?

499:デフォルトの名無しさん
09/12/29 18:15:34
obj.foo = # 代入
obj.foo << # 追加
がやりたいです。
fooは仮想的な配列でメンバー変数ではありません。

500:デフォルトの名無しさん
09/12/29 18:22:31
Ruby ではオブジェクトの外からインスタンス変数を直接参照したりはできません。
obj.foo は obj.foo() というメソッド呼び出し(が返す値の参照)です。

obj.foo() を定義して、それが返すオブジェクトの << メソッドでなんとかするしかないと思います。

501:デフォルトの名無しさん
09/12/29 18:41:19
あーなるほどそういうふうに見えるのか

502:デフォルトの名無しさん
09/12/29 19:17:45
この場合は変数操作でこの場合変数に偽装したメソッド呼び出し
みたいな使い分けで引っかかるのは理解する

>>495
あまり楽しくない

503:デフォルトの名無しさん
09/12/29 19:22:20
eclipseで開発したとして、実行はどうするんだろうね
Runとかやって、スクリプトが動いても
なんかな、って感じになりそう

504:デフォルトの名無しさん
09/12/30 02:54:55
>>495
もしかして: Aptana

505:デフォルトの名無しさん
09/12/30 11:17:47
<<を定義して配列のように見せかけている例としてはRailsの
ActiveRecordのhas_many関連がありますな。
.classですらArrayと返ってくる徹底ぶり。


506:デフォルトの名無しさん
09/12/30 15:20:41
def foo= x, y, z
end
を定義して
bar.foo = 1,2,3
と呼び出すと
./main.rb:25:in `foo=': wrong number of arguments (1 for 3) (ArgumentError)
というエラーが出るのですが、なぜ引数3つで呼び出しているのに引数の数が間違えている(1?)とか
うちのRuby様はふざけた事を言い出すのでしょうか

507:デフォルトの名無しさん
09/12/30 17:09:05
bar.foo = a, b, c は bar.foo=([a, b, c]) だからです。
bar.foo=(a, b, c) で呼び出してください。

508:デフォルトの名無しさん
09/12/30 17:12:48
syntax error, unexpected ',', expecting ')'
bar.foo=(1, 2, 3)

末尾= の場合は引数1つに限定かしらね?

bar.foo=[1, 2, 3]は
wrong number of arguments (1 for 3) (ArgumentError)


509:デフォルトの名無しさん
09/12/30 17:49:08
>507 それウソ

たぶん>>508が言うように末尾=の場合は引数1個限定だと思う
けど自信ない

510:デフォルトの名無しさん
09/12/30 21:46:36
puts RUBY_DESCRIPTION #=> ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-mingw32]
plus = "a".method(:+) #=> #<Method: String#+>
p plus.("b") #=> "ab"

この3行目のシンタックスについてparse.y以外でどこかにドキュメントありませんか?
Method.instance_methodsにそれらしきメソッドが見当たらないのですが,Methodオブジェクトに特有なものなのでしょうか?

511:デフォルトの名無しさん
09/12/30 22:47:00
foo.(arg) とすると foo.call(arg) の意味ということになった。

URLリンク(jp.rubyist.net) の「言語の中核部分」→「新しい文法と意味論」
「.()で#callや#[]を使わずにProcなどを呼べる」

512:デフォルトの名無しさん
09/12/30 22:47:50
メソッドじゃなく、文法(構文)の範囲だから instance_methods では出てこないよ。
Procでも使える。


513:デフォルトの名無しさん
09/12/31 01:32:23
>>509
やはり、呼び出すときには引数が一つしか取れないのだろうか?
でも、定義では3つの引数が必要なので、引数の数が合わないと怒られる

bar.send( :foo=, 1,2,3 )
で、引数三つ与えて呼び出せないこともないけど
なんだか、無意味な感じ


514:デフォルトの名無しさん
09/12/31 06:56:22
dhh

@37signals is already running a few minor apps on Rails 3. We've just started playing w/ porting Basecamp. Exciting times!
URLリンク(twitter.com)

Very tentative target date for Rails 3 beta is end of January. But core is staffed with volunteers, so very much subject to change.
URLリンク(twitter.com)

515:デフォルトの名無しさん
09/12/31 08:32:35
Very tentative target date for Rails 3 beta is end of January. But core is staffed with volunteers, so very much subject to change.
URLリンク(twitter.com)
dhh

516:デフォルトの名無しさん
09/12/31 09:12:32
>>511 >>512
なるほど。
指摘していただいたドキュメントも拝見いたしました。
#callをできるだけ通常のメソッド呼び出しの記法に近づけるため
#[]をオーバーライドするといった努力をしているというのは
耳にしたことがあったのですが,.()もその一環のようですね。

ありがとうございました。

517:デフォルトの名無しさん
09/12/31 22:42:29
Ruby1.9で正規表現のエンコーディングにShift_jisを指定するには
どうすればいいんでしたっけ?

オプションでsを指定すればよかったような気がしたのですが、
p /hogehoge/s.encoding
で#<Encoding:Windows-31J>が帰ってきます。

WindowsXPで
ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-mswin32]
です。
よろしくお願いします。

518:デフォルトの名無しさん
09/12/31 23:39:43
Regexp.new('あ.い.う.え.お’.encode('Shift_JIS')) かなあ。


519:デフォルトの名無しさん
10/01/01 07:30:44
明けましておめでとうございます。

>>518
/\p{ASCII}/ という表現を使いたいのでその手法は難しいんです。
今回は関係ありませんが/\x82\xA0/
という表現もその手法だと難しいですね。

マジコメでソースエンコーディングをsjisに指定するって手もあるのですが、
大人の事情でこの手法も避けたいのです。

ハチドリ本を読み返したのですが、p.335には"SJISは、s"って書いてありますね。
なんだかなぁ。

引き続きよろしくお願いします。

520:デフォルトの名無しさん
10/01/01 08:14:35
失礼しました、>>518さんの方法でできますね。
もっとスマートな方法があればいいと思うのですが、とりあえず解決です。

お騒がせしました。

521:デフォルトの名無しさん
10/01/01 14:23:19
SJISのデータを一度読み込んでUTF-8に変換してごにょごにょ
が一番綺麗だと思う。
SJISでしないといけない理由は実はなかったりしないかい?

522:デフォルトの名無しさん
10/01/01 21:58:59
rubyのアンインストール方法ってどうするんでしょうか。
./configure --prefix=/usr/local
make
sudo make install
でインストールしたのを、事情によりきれいさっぱり削除したいです。


523:デフォルトの名無しさん
10/01/01 22:45:28
>>522
特に手段は用意されてない
make -n installでファイルリストを作ってぶん回すぐらいしか思いつかないな

524:デフォルトの名無しさん
10/01/02 02:18:44
標準ストリームに対する文字コードについて教えて下さい。
まだRubyの問題なのか、OSの問題なのかも上手く切り分け出来ていません。 m(__)m

TCPでクライアントと通信するプログラムを作っています。
環境はサーバー側(作っている側)がDebian Lenny(5.03)で、文字コードはUTF-8です。
クライアントはWindows2000のマシンで、文字コードはShift JISです。

コードは次のような感じです。
他にも色々な処理が入っていますが、話を簡単にするため、コードを思いっきり削っています。

> hoge.rb

#! /usr/bin/ruby -Ku

while receive = STDIN.gets

# コマンドを受信した

msg = "受信しました" # UTF-8

# 送信処理
# STDOUT.puts( NKF.nkf('-Ws', msg)) # これだとWindows側にパケットが全く返らない
STDOUT.puts( msg) # これだとWindows側で漢字は化けるけどパケットは返る
end

というような感じです。
何かパケットが来たら、メッセージを返すものです。
(実際にはPostgreSQLを呼び出し、コマンドの結果を得て返しています。)

525:524
10/01/02 02:19:24
このコードはinetdから起動されます。

inetd.confはこんな感じ。

4142 stream tcp nowait root /usr/sbin/tcpd /usr/local/bin/hoge.rb

Rubyで扱っているUTF-8の日本語文字列を、標準ストリームにShift JISで流したいだけなのですが、上手くいきません。
Shift JISで出力しようとすると、STDOUTするところで、何事も無かったかのようにパケットが送信されません。
Rubyはエラーにもならず、その行を飛ばしたかのような挙動になります。

UTF-8のままでSTDOUTへ出力すると、Windows側で文字化けしますが、パケットは返ります。

事情により、Windows側のプログラムには手を入れられません。
どこらあたりから、見直していけば良いでしょうか?

この件の調査修正で、お正月休みも返上です。(TT)
よろしくお願いします。

526:524
10/01/02 02:48:40
あ、ごめんなさい、すっかり書き忘れていました。
Rubyのバージョンは1.8.7です。
よろしくお願いします。

527:デフォルトの名無しさん
10/01/02 04:37:19
require 'kconv'

STDOUT.puts(msg.tosjis)

528:524
10/01/02 12:29:54
>>527
ありがとうございます、しかし状況変わらずです。
NKFとkconvは、挙動が違うのでしょうか??

529:524
10/01/02 12:53:11
>>527
再び524です。

申し訳ありません、確認が足りませんでした。

このmsgには”人の名 ”(漢字3文字+空白14)というように、
ASCIIで20Byte毎に区切って送るという仕様です。
ですが、Windows側には”人の名 ”(漢字3文字+空白11文字)として
届いていて構文チェックで跳ねられていました。

ちょうど空白が漢字の文字数分足りません。

UTF-8からShift JISに変換する時に、漢字とスペースの扱いはどうなるのでしょうか?
何か、特別な処理が必要でしょうか?
以前、EUC-JPとShiftJISでやったときは、問題無かったのですが。

なんとなく光が見えてきました、引き続きよろしくお願いします。

530:デフォルトの名無しさん
10/01/02 13:25:36
どっかに全部コード貼ってから来なさい

531:デフォルトの名無しさん
10/01/02 15:32:50
>>529
utf8では漢字は2バイトではなく3バイト。
Wikipedia項目リンク

532:524
10/01/02 17:35:34
>>531
ありがとうございます、解決しました。
結局、SJISに変換してから加工するようにコードを変えました。
UTF-8では、漢字は3バイトなんですね。
勉強になりました。

お騒がせしました。

533:524
10/01/02 22:50:27
>>530
524です、今、デバッグを終えて、正常動作を確認しました。
決め手は>>532さんの「漢字は3バイト」でしたが、結構ポカミスもしてまして、今まで掛かりました。

ごめんね、プロジェクトの規模が大きすぎて、コードは晒せないの…
某自動車会社で、国土交通省に提出する書類を作成するためのシステムです。
Rubyの案件としては、中くらいの規模なんじゃないかな。
わりと重要なシステムで、止まると車が作れません。
Rubyはミッションクリティカルでも大丈夫、信頼が置けます。

pgsqlだったかな、DBIになる前の古いやつ。
それからDBIへの移植だったのですが、なかなか…
pgsqlでEUC-JPだから動いてたっていうコードが結構あって、
思っていたより全然はまりました。

何処へ質問を投げようかと思案したのですが、おまいらに聞くのが一番良い気がして
ここに書かせて貰いました。

あとは1月4日の総合テストを待つのみです。
実際に車を測定する設備が無いので、うちの社内では完全なテストは出来ないんですよ。

何はともあれ、おまいらのお陰で解決しました。
本当にありがとう。

それでは、名無しに戻ります。 m(__)m

534:デフォルトの名無しさん
10/01/03 00:12:17
>>533
身元と案件を特定出来る情報を2chに書くなよ・・・

535:531
10/01/03 00:20:53
>>533
いまのご時勢でRuby/DBIを選択しちゃうセンスは大いに疑問だが、問題が解決してよかったね。

536:デフォルトの名無しさん
10/01/03 00:25:56
> いまのご時勢でRuby/DBIを選択しちゃうセンスは大いに疑問だが

kwsk

537:デフォルトの名無しさん
10/01/03 02:32:44
通報。

538:デフォルトの名無しさん
10/01/03 04:20:45
HTTPProxyを作りたいので
WEBrickでプロキシサーバを作って遊ぶ
URLリンク(jp.rubyist.net)
を参考に

require 'webrick'
require 'webrick/httpproxy'

s = WEBrick::HTTPProxyServer.new(
:BindAddress => '127.0.0.1',
:Port => 8080,
:Logger => WEBrick::Log::new(nil, WEBrick::Log::DEBUG),
:ProxyVia => false
)

Signal.trap('INT') do
s.shutdown
end

s.start

と書いて実験してみたところ
リモートからのデータをいったんメモリに貯めてからクライアントへ渡す動作をするようです
この場合巨大なファイル(結構大きいファイルを扱うProxyを作る予定です)を通したときにメモリ消費が
洒落にならないので、読み込んだデータから逐次クライアントへ渡すような動作にしたいのですが
そのような設定は可能ですか?可能であればその方法を教えてください。よろしくお願いします

539:デフォルトの名無しさん
10/01/03 04:50:47
以前、どこかのスレで
python -i
と同じことをする方法を見たのですが、どうやるんでしたっけ?

540:デフォルトの名無しさん
10/01/03 04:57:19
$ irb

541:デフォルトの名無しさん
10/01/03 05:17:07
>>540
違う。

542:デフォルトの名無しさん
10/01/03 09:50:24
ver #=> Microsoft Windows XP [Version 5.1.2600]
ruby -v #=> ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-mingw32]

以下の簡易wget風ワンライナをより短くできませんか?

ruby -ropen-uri -e"$><<URI(*$*).read" URLリンク(www.example.com)
ruby -ropen-uri -e"$>.binmode<<URI(*$*).read" URLリンク(www.example.com)

短くならなければ「短くならないよ」というご意見や
よりスマートな代替案もいただけたら幸いです。

543:デフォルトの名無しさん
10/01/03 10:07:26
>>542
代替案ということはワンライナにこだわらなくていいんだよね?
若干強引だけどlib/site_rubyにwget.rbライブラリを作ってそのなかに処理書いちゃうとか
ruby -rwget URLリンク(www.example.com) > output
irb.batのようにbinにbat置いてスクリプト実行するとか
rwget URLリンク(www.example.com) > output

544:デフォルトの名無しさん
10/01/03 10:20:40
>>543
早速のレスありがとうございます。
ライブラリ案・バッチ案は個人で使う分にはアリですね。
コマンドもすっきりしますし。

個人的には何もライブラリやファイルをインストール(作成)せずに
Ruby単体で簡易wgetを実現できればいいなと思っています。
あまり実用的な場面はありませんが ^^;

545:デフォルトの名無しさん
10/01/03 10:44:08
>>538
データをストリーミング中継したいということでしょうか?

私はネットワークプログラミングに詳しいわけではないのでアドバイスはできませんが,
googleで "webrick ストリーミング" で検索してみてください。
1件目のブログが参考になるかもしれません。

546:デフォルトの名無しさん
10/01/03 12:22:32
>>539
対話型debugが目的なら -rdebug

対話型インターフェイスが目的なら
while true
print ">"
input = $stdin.gets.rstrip
break if input == "\x04" # ^D
puts input
end

もしくは(GNU Readlineが必要)
require "readline"
while input = Readline.readline(">")
puts input
end

pythonなんて知らんよ

547:デフォルトの名無しさん
10/01/03 13:21:29
OpenGLってDirectXに比べるとプリミティブすぎるというか機能足り無くない?
標準のシーングラフとかあっても良いと思うのだが……
何か無いですか?

548:538
10/01/03 13:46:23
>>545
レスありがとうございます
探していた情報はまさにそれです、ストリーミングも含めて考えていました
逐次転送するような動作は不可ですか・・・(´・ω・`)

以前にsocketで似たような物を実装しようとしたことがあったけどリクエスト/レスポンスの
終了を検出する方法が判らなくて断念・・・il||li ○| ̄|_

549:デフォルトの名無しさん
10/01/03 15:32:50
>>548
webrickを改造する場合にはリファレンスの以下の項が参考になるかもしれません。
Net::HTTPResponse#read_body {|str| .... }
「エンティティボディを少しづつ取得して順次ブロックに与えます。」

TCPSocketを使う場合でも
socket.gets until $_ == CRLF
でヘッダを切り離して
while data = socket.gets
...dataを料理...
end
ではダメですか?
Rubyで終端を気にする必要はなかったように思います。
他に思いつくにはヘッダのContent-Lengthを信用してそのバイト数だけ読み込むとか。
TCP/IPの規格に詳しくないので当てずっぽうですが。

550:デフォルトの名無しさん
10/01/04 01:49:17
windows機でタイマーを実装しようとしてます。
マルチスケジューリングなキッチンタイマーのようなものです。

問題がありまして、
例えば60分後にアラームを鳴らせるというタイマーのプログラムを行ったときに
やっぱりその30分前にもう一個のプログラムを追加したいと思ってもそれを行うためには
常に入力待ち状態である必要があります。
その一方で常に出力待ち状態でないと指定時刻にタイマーを実行することができません。

今は
タイマー入力(空入力も化)待機モード→
1分間のタイマー実行待機モード→
その1分の間に起こるべきイベントがあれば指定時刻にイベントを起こす→
またタイマー入力待機モードに戻る→
以下ループ

というようにユーザに入力によって待機モードを切り替えることでそれらしい動作をさせています。
どのようにすればもっとスマートにこのタイマーを実装できるでしょうか?

一つのスマートじゃない方法はテキストエディタと外部ファイルを使ってこのタイマー入力を行うことかなと思うんですが。(非排他モードでファイルの書き込み読み取りする)
forkがwindows rubyでは使えなくて、そもそも子プロセスを使ったことがないので悩んでいます。

551:デフォルトの名無しさん
10/01/04 01:57:34
URLリンク(www1.axfc.net)

しょーもないソースコードですが、文章で書くより伝わりやすいと思うので
よろしくお願いします。

552:538
10/01/04 03:29:30
>>549
レスありがとうございます
WEBrickはソースコードを理解するだけで時間が相当かかりそうな感じなので
改造はあきらめます・・・

バイナリデータをgetsで読み出そうとすると最悪の場合、最後まで読み込んで
しまうように思いますが・・・
Socketの終了が判らない件ですがノンブロックモードで読み出す方法
(sysreadを使う。getsが使えなくなるけど・・・)が判ったのでひとまず解消しました
普通にreadを使うとブロックモードなんで帰ってこない・・・(TT

しかし1セッションに複数のホストへのリクエストとかマンドクセ(´・ω・`)

553:デフォルトの名無しさん
10/01/04 05:32:35
>552
getsはバイト列に$/(普通は0x0A)がでてこなければ
最後まで読み込んでしまうけれど、その確率は気にするほどのものかな
ミッションクリティカルなアプリケーションならしかたないとは思うけど

554:デフォルトの名無しさん
10/01/04 06:17:44
>>550
つ Thread & ConditionVariable

555:デフォルトの名無しさん
10/01/04 12:40:48
あるURLから特定のURLのみを抽出するにはどうしたらいいでしょうか?
例えばURLリンク(menu.2ch.net)から"pc11"が含まれるURLを抽出したいです。

require "open-uri"
url = ARGV[0] || "URLリンク(menu.2ch.net)"
uri = open(url).read
URI.extract(uri, ['http']){
|uri|
puts uri
}

URL自体を抜き出すのは比較的簡単に出来たのですが、特定のURLを抜き出すのってこの状態からどうしたらいいでしょうか?
宜しくお願いします。

556:デフォルトの名無しさん
10/01/04 13:03:47
puts uri if /pc11/ =~ uri.to_s

557:デフォルトの名無しさん
10/01/04 13:05:12
>>555
URI.extract の返値(URI の配列)に対し find_all でいいんじゃない?

str = open(url).read
URI.extract(str, ['http']).find_all {|uri| uri =~ /pc11/ }

正規表現マッチの部分はもう少し厳密にした方がいいと思うので適当に

558:557
10/01/04 13:13:58
返値を変数に格納するの忘れてたw

559:デフォルトの名無しさん
10/01/04 13:20:49
str = open(url).read
URI.extract(str, ['http']).grep(/pc11/)

560:デフォルトの名無しさん
10/01/04 20:31:50
「特定のURLを抜き出す機能」と考えるからわからなくなるんだと思う

配列から特定の条件を満たす要素を抜き出す方法とか
URIオブジェクトのURI構成要素を返すメソッドは何かとか
そういうの調べていったほうがたぶん早い

561:デフォルトの名無しさん
10/01/04 20:41:17
御託はいいから妥当解とっとと出せカス

562:デフォルトの名無しさん
10/01/04 20:43:13
「手抜き」じゃね?
いつ動かなくなるのか不安だ。。

563:デフォルトの名無しさん
10/01/04 20:51:14
どうでもいいけど、
普通はstr = open(url).{|io|io.read}じゃね?
それかstr = URI(uri).readか。

564:デフォルトの名無しさん
10/01/04 20:54:18
>>561
require 'open-uri'
url = "URLリンク(menu.2ch.net)"
purls = URI.extract(open(url).read, ['http'])
uris = purls.map{|url| URI.parse(url)}.find_all{|uri| /\Apc11\.2ch\.net\Z/ =~ uri.host}

ただ、
 「URLを抽出したあとそれに対して何をしたいのか」
 「本当に抽出したいのは本文のURLではなくて<a href>のリンクなのではないか」
 「貴様は次のレスで「あっあとhttp://も抽出したいです」と言うッ!」
とかいうような危惧がないわけでもない

普通にHTMLパーサ通したほうが近道だったり
一般的な適当範囲の正規表現を通したほうがマシな処理だったりしなくもなくもないかも


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

5390日前に更新/233 KB
担当:undef