Ruby初心者スレッド Part 12at TECH
Ruby初心者スレッド Part 12 - 暇つぶし2ch175:134
07/05/08 17:43:14
>>139
ありがとうございます! でもダメでした
mvしようとしたら、permission deniedってエラーが出るんです・・・

>>143
これもエラーでした。Ko1が見つからないそうです

176:デフォルトの名無しさん
07/05/08 20:49:51
>>174
うん、こくさいか

177:デフォルトの名無しさん
07/05/08 20:53:58
>>173
IntToStr って、# よりゴチャゴチャしてるだろ・・・

178:デフォルトの名無しさん
07/05/08 21:42:36
俺はエディタが色変えてくれるおかげか、#{ }はそんなにゴチャゴチャ
してるようには感じないが、色の変化がなければちょっとキツイかも

179:デフォルトの名無しさん
07/05/08 21:45:26

       FOX★公認!!!

俺たちのクリックで日本を一位にしようぜ!!
“30年は日本に手は出せないな”という勝ち方をしたい
スレリンク(news4vip板)

1. ポーランド  139,797,680
2. チリ     137,040,439
3. ★日本    86,475,213★
4. イスラエル  80,930,530
5. スロベニア  57,137,042
6. フィンランド  40,857,499

石を投げる戦争から人は進化・進歩を遂げ、剣や槍などの武器をもって戦うようになった
人間はさらに発展し兵器を使う戦争を始めた
そして今、指先一つを武器とした電脳戦争が勃発したのであった・・・
皇国を勝利へと導くには貴様らの参戦が不可欠である

・戦場
URLリンク(www.clickclickclick.com)
・まとめサイト
URLリンク(www33.atwiki.jp)


180:デフォルトの名無しさん
07/05/08 21:56:52
コピペ君って馬鹿だな、まで読んだ。

181:デフォルトの名無しさん
07/05/08 23:12:54
ruby のif文って使いにくくないですか?
if ひとつにつき end を付けなきゃいけないから深く掘り過ぎるとend一つか二つ忘れる・・・

182:デフォルトの名無しさん
07/05/08 23:28:55
Perl の if 文って使いにくくないですか?
if ひとつにつき } を付けなきゃいけないから深く掘り過ぎると } 一つか二つ忘れる・・・


そんくらいで使いにくいってあり得ないだろ。
というか、if 書いた時にはとりあえず対の end を書いてから、中身を書くもんだ。

183:デフォルトの名無しさん
07/05/08 23:39:26
まあ、改行で区切る仕様でもよかったとは思う

endはエディタの支援機能で書く

endと書いてTabキーを押すとinvalid nestとか文句言われる

184:デフォルトの名無しさん
07/05/08 23:42:06
そしてインデントで区別する仕様に(ry

185:デフォルトの名無しさん
07/05/09 00:49:42
いまだに
if(){
}
って書いて実行時にあれ?って思うことが良くある


186:デフォルトの名無しさん
07/05/09 01:05:18
稀に when と case を間違えるのは俺だけでいい
しかし

return << <<EOF
<html>
<title>やほー</title>
<h1>#{title}</h1>
</html>
EOF

とか

html <<EOB
<table>
<tr><td>テーブルだよ</td><tr>
</table>
EOB

とか書いてエラーに悩んでしまう人は俺以外にも居ると信じていいですか

187:デフォルトの名無しさん
07/05/09 01:12:40
>186
いないとは言わないが敢えて言わせてくれ
このうっかりさん ( ゚∀゚)σ)∀`)

188:デフォルトの名無しさん
07/05/09 01:20:18
<<-EOF
って書くようにしてるけど

189:デフォルトの名無しさん
07/05/09 01:24:15
>>171
Ruby以前に10年Cプログラマをやってたおれがやってきましたよ。
Rubyでprintfとかほとんど使ったことありませんよ。だって#{}の方が便利だもの。

190:デフォルトの名無しさん
07/05/09 01:24:19
なんでむりなんだろ

191:デフォルトの名無しさん
07/05/09 01:24:32
>>169
ruby-gettextを入れると % が拡張されていろいろ便利になるよ。
標準にしてもいい気がするくらい。


192:デフォルトの名無しさん
07/05/09 01:59:03
#とか{}や()って入力めんどくさくない?
printf("%d",a )とかのほうが楽で慣れてる。

193:デフォルトの名無しさん
07/05/09 02:00:15
別に

194:デフォルトの名無しさん
07/05/09 02:01:09
>>192
人によりけり

195:デフォルトの名無しさん
07/05/09 02:03:11
>>192
> 慣れてる
自分で答言ってるじゃん

196:デフォルトの名無しさん
07/05/09 02:49:22
>>192
ダブルクオートの中にカーソルがあるときに、
Ctrl+"を押すとエディタが#{}と出して括弧の中にカーソルを置いてくれるようにしている。
なので全然面倒じゃない。

197:デフォルトの名無しさん
07/05/09 10:21:12
>>196
そのマクロ俺にも下さい!

198:デフォルトの名無しさん
07/05/09 11:55:19
キーマクロとか

199:デフォルトの名無しさん
07/05/09 12:20:33
"マクロ"じゃなかったりして

200:デフォルトの名無しさん
07/05/09 12:34:35
とゆーか近似的には

 ・ 「Ctrl+Shift+2」(あるいは単にCtrl+2)のキー動作を常用から外す
 ・ C-S-2に「#{}の3文字を挿入しカーソル1個戻す」機能を振り分ける

ということをするだけで用が足りそうだが

#{}が有効な文字列の判別とか定義面倒そうだし、有効かどうかでC-S-2の動作が違うのは混乱しそうだ

201:デフォルトの名無しさん
07/05/09 12:55:43
3ならわかるがなぜ2なんだ。

202:デフォルトの名無しさん
07/05/09 13:36:43
>>201
どういう配列のキーボード使ってる?

203:デフォルトの名無しさん
07/05/09 13:51:31
どっちもどっちだな

  " (ダブルクオーテーション)
相当の入力で挿入を開始するのも
  # (ナンバーサイン、いわゆる半角シャープ)
相当の入力で挿入を開始するのも
どっちもそれなりに道理にかなってる気がする

204:デフォルトの名無しさん
07/05/09 14:23:59
bikeshedな議論は盛り上がるなあ

205:デフォルトの名無しさん
07/05/09 14:32:41
閑話休題

俺は^2には括弧閉じ機能を割り当ててるな。
{foo("bar #{a■
 ↓
{foo("bar #{a■}")}

こんな感じ。

ところでRubyのbegin~endってめちゃくちゃウザいよな。
エディタの支援があるならPython方式のほうがはるかに
優れているというのは一目瞭然だな。

206:デフォルトの名無しさん
07/05/09 14:33:06
平和を愛して何が悪い(w

207:デフォルトの名無しさん
07/05/09 14:49:13
P
y
t
h
o
n方式


左に戻ってこいよ


うまい言語仕様ってなかなかないもんだな

208:デフォルトの名無しさん
07/05/09 15:30:03
begin~endが嫌ってのはたまに言われるな
俺には理解できないが

209:デフォルトの名無しさん
07/05/09 15:57:29
漏れも始めは嫌だったけど、慣れたなあ。
むしろ今はPythonみたいに閉まりがないのは嫌。

210:デフォルトの名無しさん
07/05/09 18:01:35
Pascal/Delphiのbegin-endの羅列よりは全然マシだろ
あれはC言語の { } をそのまま begin end に置き換えたみたいな
(当然正確には違うんだが)書き方するからなぁ

211:デフォルトの名無しさん
07/05/09 18:02:56
隔離スレでやれ

212:デフォルトの名無しさん
07/05/09 19:52:40
moduleのクラス(?)メソッドを追加するときって必ず
def self.hogehoge
ってやらないといけないんですかね?

class << self
みたいな文法があればいいなぁ、と…

213:MoonWolf ◆MoonWdLnkQ
07/05/09 19:52:51
Pythonのインデント方式は何個のネストを終了したかが分からなくなるから嫌い。


214:212
07/05/09 19:54:30
すいません、moduleでもclass << selfいけました…o....rz

215:デフォルトの名無しさん
07/05/09 19:56:49
記号の方が区切りが目に入りやすいんだよな。
だから end は俺も嫌い。

216:デフォルトの名無しさん
07/05/09 20:13:57
そんな表示フォント依存の話を言語仕様に持ち込まれても困る

217:デフォルトの名無しさん
07/05/09 20:28:23
フォントの問題じゃないだろー。
英文って似たような文字の羅列でどこも目立たないけど、
記号があると目立つだろ。

218:デフォルトの名無しさん
07/05/09 20:51:13
おまいら
perlでも使っとけ

219:デフォルトの名無しさん
07/05/09 20:52:48
あれは記号大杉

220:デフォルトの名無しさん
07/05/09 20:57:09
lllllll|!1111|1111lll!l|1l1l1!l1|1


まあどうでもいいが
とりあえず{;]!|):}[(の見分けにくさは異常

いっそ |==> から始まって <==| で終わるとかして欲しい

221:デフォルトの名無しさん
07/05/09 21:03:09
俺は ! の後には 1 つ空白入れるようにしてる。

222:デフォルトの名無しさん
07/05/09 21:06:19
ふつーのブロックは begin - end でいいから、
せめて def と class と rescue のブロックの終わりは別な語にして欲しかった

end # each
end # if
return array
end # each
end # rescue
end # def
end # class

### ↑ class Hoge
### ------------------------
### ↓ HogeをUnyaするクラスUnya

とかコメント書いてて泣きたくなる
いやこのへんは俺が未熟なんだけど

223:デフォルトの名無しさん
07/05/09 21:17:30
emacsとか使って、ちゃんとインデントしてれば問題ない
と思うけどなあ。


224:デフォルトの名無しさん
07/05/09 22:04:35
どうでもいい話は、
学が無い奴等でも参加できるから
議論が活発になるってのは本当だよな。

「記号があると目立つだろ」、とか「人による」としか言えんことを
水掛け論的に言ってどうなるというのだろう。

225:デフォルトの名無しさん
07/05/09 22:08:55
>>224
もしかして意味を見出せてないの??

226:デフォルトの名無しさん
07/05/09 22:19:15

こうやって、またどうでもいい議論に引きずり込もうとするんだよな…。

227:デフォルトの名無しさん
07/05/09 22:28:38
学(がく)がある人(ひと)がどうしてruby初心者(るびーしょしんしゃ)スッドレにいるのか
俺(おれ)には理解(りかい)できない

228:デフォルトの名無しさん
07/05/09 22:33:27
>>224
デザイン論を根底から否定する暴言ですな。

229:デフォルトの名無しさん
07/05/09 22:37:37
>>224は学が有ったとしても空気が読めないvb厨にそっくり

230:デフォルトの名無しさん
07/05/09 22:42:52
「学が無い奴等」というより
「まともな知能が欠如した奴等」の方が的確だな。

231:デフォルトの名無しさん
07/05/09 22:44:23

こうやって、またどうでもいい議論に引きずり込もうとするんだよな…。

232:デフォルトの名無しさん
07/05/09 22:50:24
スレリンク(tech板)
行ってらっしゃい

233:デフォルトの名無しさん
07/05/09 23:01:53
どうでもいい話でしか参加できないからしょうがない。

234:デフォルトの名無しさん
07/05/09 23:02:29
>>224から有益な議論を引き出せない奴らは屑

235:デフォルトの名無しさん
07/05/09 23:57:27
ここは議論するスレというより
初心者の質問とそれに対する回答
もしくは質問を肴にした雑談
のスレでなかったのか

236:デフォルトの名無しさん
07/05/10 00:00:53
超肴中

237:デフォルトの名無しさん
07/05/10 00:06:38
hash[keyword] << word
ってなにやってるの?
<<て何よ?

238:デフォルトの名無しさん
07/05/10 00:18:43
>237初心者らっさい
hashに配列が登録されててそれにpushしてるんだと思うぞ

239:デフォルトの名無しさん
07/05/10 00:19:50
>>197
はいよー

(defun ruby-string-expand-expression ()
"Rubyの文字列中にカーソルがあれば#{}を挿入する。リージョンがあればそこを#{}で括る"
(interactive)
(let ((parens (if (eq 'font-lock-string-face (get-char-property (point) 'face))
'("#{" "}")
'("¥"" "¥""))))
(if mark-active
(progn
(if (> (point) (mark))
(exchange-point-and-mark))
(insert (car parens))
(exchange-point-and-mark)
(insert (cadr parens)))
(progn (insert (concat (car parens) (cadr parens)))
(backward-char)))))


240:デフォルトの名無しさん
07/05/10 00:20:46
21世紀にもなってema糞はないだろう

241:デフォルトの名無しさん
07/05/10 00:22:39
いやあるよ。便利だもん

242:デフォルトの名無しさん
07/05/10 00:22:39
21世紀はVimだよな!Vim7さいこおおおおおおおお

243:デフォルトの名無しさん
07/05/10 00:26:03
お、7 出たのか?

244:デフォルトの名無しさん
07/05/10 00:28:00
>>237
そんなあなたに irb
irb上で試せばいろいろわかるぞ

irb> h=Hash.new
irb> h['hoge'] << 'test'
NoMethodError: undefined method `<<' for nil:NilClass
from (irb):2
irb> h['hoge'] = 'nya'
=> "nya"
irb> h['hoge'] << 'test'
=> "nyatest"
irb> p h['hoge']
"nyatest"

ということで「ハッシュhashのkeywordの値に適当に<<して更新してる」模様

245:デフォルトの名無しさん
07/05/10 00:36:01
<<だけでハッシュの中身が追加更新されるのはなんかキモいな
いやとても便利だが

>>243
Vim7はちょうど1年前に出てる
ただいま醸成中
なんかね、どんどんデカくなってな

246:デフォルトの名無しさん
07/05/10 00:44:31
Vimって前に使おうと思ったことあるけど、マクロで任意の位置の文字列を取得する方法がわからなくて挫折した記憶がある。

247:デフォルトの名無しさん
07/05/10 00:48:19
間違って入力したらいちいちEsc押してコマンドモードに戻してxとか押さなきゃいけないのが面倒でメイン化挫折してる(全く使わないわけではない)
最近のは挿入モードでもBackSpaceとか平気で効くけどな

248:デフォルトの名無しさん
07/05/10 00:49:28
vi と vim は別物だぜ。
vi はイマイチ。vim 最高。

249:デフォルトの名無しさん
07/05/10 01:59:38
両方試して自分はemacsが好きなんだけど、
最近はvim派が多いのかな?

250:デフォルトの名無しさん
07/05/10 07:03:08
先生! xyzzyはemacs派に含まれますか?

251:デフォルトの名無しさん
07/05/10 12:19:12
レンタルサーバでRubyスクリプトのCGIを動かしてます

メモリ内に大きなデータを保持してる時間をなるべく減らしたいなと思い

def メイン
html = ネットにあるでかいHTML
data = htmlをparseしたハッシュ
html = ''

htmlを参照しないごっつい処理
htmlを参照しない手間のかかる処理
htmlを参照しないめんどくさい処理

return 何か #終了
end

などと「途中で大きなデータの参照先を明示的に空」にしてるんですが

・ データ保持時間短縮という点で一応意味はある
・ 気休めにもならないし読みにくいからやめとけ
・ 「HTMLをgetしてパースして返す」メソッド作っとけばいいじゃん

など意見お願いします

252:デフォルトの名無しさん
07/05/10 13:21:27
>251
htmlの処理とhtmlを参照しない処理の
メソッドを分ければ、気にする必要なくなると思うが

253:デフォルトの名無しさん
07/05/10 13:27:46
メソッド分ければHTML使うメソッド終わった時点でGCが回収にくるよな
そりゃ空文字列指定すれば回収までの数瞬の間は軽くなれるとは思うが

254:デフォルトの名無しさん
07/05/10 13:34:36
>メソッド分ければHTML使うメソッド終わった時点でGCが回収にくるよな
そうだっけ?

255:デフォルトの名無しさん
07/05/10 13:43:29
>254
否。

$n = 1343

def foo
  s = "." * $n
end

def print
  ObjectSpace.each_object{|o|
    if o.is_a?(String) && o.length == $n
      puts "found"
      return
    end
  }
  puts "not found"
end

print # not found
foo
print # found


256:デフォルトの名無しさん
07/05/10 13:45:37
「回収対象になる」が正確かも
実際に収集車が回収しにくるのは回収日

257:デフォルトの名無しさん
07/05/10 13:54:54
空白文字列代入するのもゴミ袋を交換して
ゴミ出して回収待ちってとこだよな


258:デフォルトの名無しさん
07/05/10 13:59:16
ゴミの袋の数は変わってないけど、
ゴミの大きさはコンパクトになって部屋なりご近所なりを圧迫することがなくなってるはず
という主張なんじゃね、最初の話は

259:デフォルトの名無しさん
07/05/10 14:07:40

def make_str
puts "making now..."
return 'hoge'
end

str=make_str

p str
p str

strはmake_strを「指してる」以上、make_strはstrが使われるたびに毎回動くべきで
この場合"making now..."は2回表示されるべきだと感じます
たすけて

260:デフォルトの名無しさん
07/05/10 14:16:23
>>259
勝手に「べき」とか思わないように。

str=make_str は、「make_strメソッドを呼び出してその返却値をstrに代入する」という意味なので、その後何回strを参照しようがmake_strはもう呼ばれない。

261:デフォルトの名無しさん
07/05/10 14:47:15
>>259
1回しか動かないのは、"1回目"の = で str が指すオブジェクトが確定してる(make_str で return されるもの)から
と考えるのはどう。

確かに「参照の矢印のようなもんである」という考えだけで字面を遡ると make_str を再度呼ぶようにも見えなくはない。
str は make_str で、その make_str は上に書いたヤツだから。

262:デフォルトの名無しさん
07/05/10 14:47:17
>>251
> 「HTMLをgetしてパースして返す」メソッド作っとけばいいじゃん
が正解だと思う
それならわざわざ空白文字代入する必要もないしな

263:デフォルトの名無しさん
07/05/10 14:58:13
>>262
メモリ占有を考えるなら「空データで上書きする」意味はあるようにも思うけど…どうだろ

まあどっちにしても上書きはパラノイアっぽいな
小さいメソッド内のローカル変数で完結させてGCの回収対象にしておく、というのがふつーの対処法なのかも

264:212
07/05/10 17:36:46
>>259
str=make_str

str=make_str()
は等価だと思うんだが

265:デフォルトの名無しさん
07/05/10 17:38:25
あら、残ってた…o...rz

266:MoonWolf ◆MoonWdLnkQ
07/05/10 18:21:42
空データなら''よりもnilのほうが軽くない?


267:デフォルトの名無しさん
07/05/10 18:39:29
有為な差はないと思うけど、nilのほうが「変数をクリアしました」という感じがでるので好き。
できればRubyにも undef みたいなのがあるといいんだけど。

268:デフォルトの名無しさん
07/05/10 20:28:06
p がオブジェクトの中身を参照する命令だとすると
p str で strの中身 hogeが表示される、と。

もし str = make_str で strが関数オブジェクトとして扱われると
仮定すると(なんかjavascriptみたい)、p str で表示されるのは
make_strという関数オブジェクトの中身が表示されるはず…。

それをさらに飛躍(蛇足?)させて
p str で関数を呼び出せるのはとてもイレギュラーな命令のように感じます。

ruby だと p は、基本的にオブジェクトの中身を参照する命令と
考えればおkみたいなかんじですか?とか聞いてみたり。

269:デフォルトの名無しさん
07/05/10 20:32:40
なんか日本語が変だなっと orz

270:デフォルトの名無しさん
07/05/10 21:19:24
str = make_str を「strというキーワードでmake_strを"起動"した値を返す」と読めばいい

もし右辺が変数なら変数内容を"起動"するわけ
なんかめんどくさくなってきたからどうでもいいや


要は参照先が"定まった値を持たない"メソッドであるのが引っかかるんだろ
strが参照されるたびに「参照先のメソッドの返り値はhogeです」と動作すると思えると


271:デフォルトの名無しさん
07/05/10 21:45:34
CGI.escapeをするとhttp://のスラッシュの部分までエンコードされてしまって
IEが勝手にhttp://を付け足してURLリンク(http%3A%2F%2F) ...と言う風になってしまいます。

一般的にURLエンコードする場合って言うのはどういう場面なんでしょうか?
はてなブックマークとかも日本語をエスケープしてるくらいでURLエンコードしてないように見えるのですが。。。
根本的なところが分かってないので使い場所を間違っている気がしてきました…。
今のところはhtmlescapeと同じように手当たり次第にやってます

272:デフォルトの名無しさん
07/05/10 21:50:32
URL全体をエスケープするんじゃなくて、cgiに渡すパラメータだけエスケープするんだよ。

273:デフォルトの名無しさん
07/05/10 22:26:55
>>270
str=make_str() # 関数呼び出し making...表示 返り値hoge格納
p str # オブジェクト表示、hoge表示
p str # オブジェクト表示、hoge表示

すみません。もの凄く初歩的なことを難しく考えすぎてた
だけみたいでした。ありがとうございました!

274:デフォルトの名無しさん
07/05/10 22:39:39
>>271
CGI.escapeは引数をすべてエンコードする(用途が違う)
いわゆる日本語入りURLを簡単に作りたいのならURI.escape使え

irb> str='オブジェクト指向'
irb> URI.escape("URLリンク(d.hatena.ne.jp))
=> "URLリンク(d.hatena.ne.jp)
irb> CGI.escape("URLリンク(d.hatena.ne.jp))
=> "http%3A%2F%2Fd.hatena.ne.jp%2Fkeyword%2F%A5%AA%A5%D6%A5%B8%A5%A7%A5%AF%A5%C8%BB%D8%B8%FE"

strの文字コードによってエスケープ後の表記が違うから気つけろな(上記は日本語EUC)

275:237
07/05/11 00:00:52
>>238
>>244
レスありがとうございますにゃん
おかげで助かりました
動作は自分でもソース書いて確認しました

が、これいったいドキュメントのどこ読んで勉強すりゃいいんでしょ?
演算子の項目みてもそれらしい説明無いし


276:デフォルトの名無しさん
07/05/11 00:15:44
一つ質問があるのですが、
rubyで他の言語のsubstringみたいなのはありますか?

277:デフォルトの名無しさん
07/05/11 00:29:25
「他の言語のsubstring」ってのが具体的にどういう動作を期待してるのか
今一分からんが
例えばJavaScriptのString#substring()については
String#[s...e]
が近いかな

//JavaScript
"abcde".substring(1,3) == "bc"

# Ruby
"abcde"[1...3] == "bc"

278:デフォルトの名無しさん
07/05/11 00:30:14
str[first, len]
str[first..last]
str[first...next]
str.slice(上に同じ)
str.slice!(上に同じ)

279:デフォルトの名無しさん
07/05/11 00:30:34
>>275
「標準ライブラリ」内の「組み込みクラス」の項を参照
数値・文字列・配列・ハッシュなどの基本的な振る舞いは、ここを見ればだいたい分かる

>>276
とりあえずStringのメソッドを片っ端から探し回ると吉

280:237
07/05/11 00:53:24
>>279
ありがとサンクスベロマッチェですにゃん
Kernelもっと理解しとかなきゃダメだな

281:デフォルトの名無しさん
07/05/11 01:21:42
今日はスレッドの勉強をしようと思う

282:デフォルトの名無しさん
07/05/11 10:05:07
そうか

283:デフォルトの名無しさん
07/05/11 10:07:25
すれでどうした

284:デフォルトの名無しさん
07/05/11 10:10:24
>>282
モルモンです

285:デフォルトの名無しさん
07/05/11 14:35:08
だれが上手いこと言えといった

286:デフォルトの名無しさん
07/05/11 14:42:27
puts '文字列を入力してください'
x = gets.chomp
puts '入力された文字列は「' + x + '」です'


文字列を入力してください、と表示させてからコンソール入力をさせたいのですが、
その前にコンソール入力になってしまいます。
これはどのように解決したらよいのでしょうか?

287:デフォルトの名無しさん
07/05/11 14:52:28
>>286
$stdout.flush を gets の前の行に。

288:286
07/05/11 15:03:00
>>287
解決しました
ありがとうございます

289:デフォルトの名無しさん
07/05/12 19:15:48
「プログラミングRuby」のうさぎ本のほう持ってるんだけど、
改訂版(2分冊のほう)になってどれぐらい良くなったの?

290:デフォルトの名無しさん
07/05/13 08:40:07
>>186
これって、何が悪いの?




291:デフォルトの名無しさん
07/05/13 08:48:50
>>290
最初のやつ:returnは制御構造なので<<演算子を適用できない。

次のやつ: htmlは多分変数でメソッドではない。このとき、
     この式は変数htmlに
          html "baka"
     と書くのと(文字列の中身を覗いて)等価だ。

292:デフォルトの名無しさん
07/05/13 09:50:36
ヒアドキュメント「<<EOF」が「次行からEOFまでを返す式」のように機能するということを失念した誤りだな
っていうか << と同じ記号使ってなおかつ間に空白があるかないかで動作が違うなんて極悪だ

293:デフォルトの名無しさん
07/05/13 11:08:27
つまり、
 html << <<EOB
か、
 html = <<EOB
ならおkっつーことですね。

294:デフォルトの名無しさん
07/05/13 19:36:40
  open(file) do |f|
    while s = f.gets.chomp
      
    end
  end

だとエラーが出ます。
 in `test': private method `chomp' called for nil:NilClass (NoMethodError)

以下の一行だとうまくいくのに何ででしょう?

 puts f.gets.chomp

ところで、

 f.gets.class

するとStringなのになぜ?

295:デフォルトの名無しさん
07/05/13 19:37:47
>>294
に関連してなのですが、

Rubyで、ファイルを読み込んで一行ずつ処理する定石って他にはありませんか?

逆引きRubyには、>>294のchompなしのが書いてありました。

296:デフォルトの名無しさん
07/05/13 19:38:23
ファイルを最後まで読み切った以降は、f.getsがnil返すからだろ。

297:デフォルトの名無しさん
07/05/13 19:39:33
IO.foreachでもつかってろ

298:デフォルトの名無しさん
07/05/13 19:45:25
>>295
IO#each_lineかな

299:デフォルトの名無しさん
07/05/13 20:36:23
ARGV.each
だっけ?で大概間にあうな

300:デフォルトの名無しさん
07/05/13 21:11:13
>>296
あ、そっかー!ワカタ

>>297
IO.foreachは短くてよいですね。

IO.foreach("log.txt") do |s|
  puts s
end

>>298
IOオブジェクトを取得していた場合は、IO#each_line=IO#each使うということで・・・

open("log.txt") do |file|
  file.each do |s|
    puts s
  end
end

>>299


301:デフォルトの名無しさん
07/05/13 21:12:06
間に合うも何も動作違うんだから
無目的にコピペして動かんとか文句垂れずに用途に合わせて利用して終了検知しろよ

302:MoonWolf ◆MoonWdLnkQ
07/05/13 21:19:42
>>295
IO#eachとかwhile text=io.getsかな。

>>299
ARGF.each

自動的にchompしてくれる奴が欲しいなぁ。


303:デフォルトの名無しさん
07/05/13 21:42:28
ARGF.each do |line|
line.chomp!
end
でどうよ


304:デフォルトの名無しさん
07/05/13 22:05:35
リファレンスの Hash.new {|hash, key| ...} のサンプルの
「# ブロックを使うとうまく行く」は h = Hash.new {"foo"} ではだめ?
いきなりあんなことされても意味が全然わかりません.

305:デフォルトの名無しさん
07/05/13 22:50:42
>>303
それがやだ、という話だと思った。そんな我が儘言われてもとは思うけどw

306:デフォルトの名無しさん
07/05/13 23:01:50
>>304
えーと、どこから説明していいものか。ちょっと複雑になるけど説明してみる。

まずその例は値を与えていないハッシュのキーに初期値を与えたいってことだよね。
んで初期値を整数にしたいときはh = Hash.new(0)でできる。このとき、
h[1]=0とか代入しなくてもh[1]は0になる。ここまではいいね?

では初期値として"baka"(文字列)を与えてみたらどうなるか。

 h2 = Hash.new("baka")
 p h2[1] # => "baka"
 h2[1] << "shine"
 p h2[1] #=> "bakashine"
 p h2[2] #=> "bakashine" ??? "baka"ではないの?

ということになる。それぞれの初期値は同じインスタンスを指しているためにこういったことが起こる。
これは直感に反する動きなのでそれを解決するためにブロックを渡せるようにした。

 h2 = Hash.new{|h, k| h[k] = "baka"} # その都度新しいStringオブジェクトを生成して代入
 p h2[1] # => "baka"
 h2[1] << "shine"
 p h2[1] #=> "bakashine"
 p h2[2] #=> "baka"

というわけ。ややこしいけど。



307:MoonWolf ◆MoonWdLnkQ
07/05/13 23:20:06
ハッシュへの代入は必須じゃないからね。
ブロックの評価した値が戻り値になる。
たまに複数行のブロック書いて、それを忘れてはまる。


308:デフォルトの名無しさん
07/05/13 23:20:54
ここ読んでて仕事思い出したわ
逝ってくる

309:304
07/05/13 23:43:38
>>306
その機能を実現するだけならば, 単に h2 = Hash.new {"baka"} で可能ですよね.
ブロック引数 key, hash を持ち出すならば, 本質的に引数を必要とするような,
もう少し複雑な例を別にリファレンスに提示すべきと思ったのです.

310:デフォルトの名無しさん
07/05/13 23:46:02
>>309
可能ではないです。コード列の最初の例はかなり直感に反すると思いますがいかがですか?
h[1]に破壊的メソッドを適用したら、なぜかh[2]も変わってしまうんですよ。

# いや、べつに「なぜか」はわかっているんだけども

311:デフォルトの名無しさん
07/05/13 23:47:47
>>309
あ、ごめんなさい。言っている意味を取り違えていました。
たしかに固定の文字列だけを与えるのであればそれでもいいでしょうが、
せっかくブロックを取るのであればもっと汎用な形の方がいいんじゃないすかね。
この場合ハッシュとキーが渡ってくればなんかいろいろできそうじゃないっすか。

312:デフォルトの名無しさん
07/05/14 00:05:48
こんな感じとか?

nickname = Hash.new{|h, k| h[k] = k}
nickname['浜崎伝助'] = 'ハマちゃん'
nickname['鈴木一之助'] = 'スーさん'
p nickname['浜崎伝助']
p nickname['佐々木和男']


313:デフォルトの名無しさん
07/05/14 00:41:20
>305
こんなんでどう。
class IO
def each_line2()
self.each_line {|line| yeild(line.chomp) }
end
end


314:デフォルトの名無しさん
07/05/14 00:43:50
h = Hash.new{"baka"}
p h[0].object_id
p h[0].object_id
p h[0].object_id

h = Hash.new{|x, k| x[k] = "baka"}
p h[0].object_id
p h[0].object_id
p h[0].object_id

315:304
07/05/14 01:02:57
>>314 俺は1つ目の動作で無問題と思っていたけれど,
ハッシュのあるべき姿は2つ目の動作ということ? なら仕方ない.
>>312 は思い出にしまっておきます. お返しにこれ.
files = Hash.new {|h,path| h[path] = File.open(path, 'w') }

316:デフォルトの名無しさん
07/05/14 13:28:33
>302-303 >305 >313
io.read.split($/).each {|line| ... }
というのはどうだろう。でかいファイルにはあまり使いたくないが。

317:デフォルトの名無しさん
07/05/14 21:24:26
>>316
つ 富豪的プログラミング


318:デフォルトの名無しさん
07/05/14 22:06:13
>>316
io.readlines.each {|line| ... } に短縮できるよ

319:デフォルトの名無しさん
07/05/14 22:50:06
>>318
chompが抜けてる。


320:デフォルトの名無しさん
07/05/14 23:12:18
そのへんはブロックのなかでなんとかするんだろ

321:318
07/05/14 23:15:50
>>319-320
すまん、IO#readlinesが改行ごと返すの忘れてたんだ

322:デフォルトの名無しさん
07/05/15 11:56:52
関数内でincludeしているソースを見かけたのですが、これって何をしてるんですかね?
ただ単に遅延評価(?)でその関数が呼ばれたときにMix-inされる
っていうだけなのか、Mix-inされている期間がその関数内だけなのか

そもそもなんか気持ち悪いですね。。


323:デフォルトの名無しさん
07/05/15 12:01:41
>>322
関数外の名前空間を汚さずに、そのincludeされたmoduleのメソッドを使えるじゃん

324:デフォルトの名無しさん
07/05/15 12:33:55
関数って何で(略

めったに使用されないメソッドでしか使わないものを
そのメソッド内でrequireやincludeすることはある
普段の起動時に読まないぶん普段の動作が若干速くなったと思い込んでるが効果のほどはよくわからん

325:デフォルトの名無しさん
07/05/15 12:34:41
>>323
includeはメソッドローカルじゃねえ

326:デフォルトの名無しさん
07/05/15 14:10:32
VS.Net 2005 でビルドした ruby 1.8.6 を C++ のプログラムに組み込もうと思ってる
んですが、うまくいきません。
どーも Socketを使おうとするとdllとかのビルド環境違いでこういう問題(?)が起こる
ようですが、手元の ruby は手元の VS.Net 2005 でビルドしたもので、原因がわから
ず……。Net::HTTP などが使えません。

ruby 1.8.6 は VS2005 のコマンドプロンプトから configure.bat, nmake, nmake install
でビルドし、C\:Program Files\ruby の bin\ から msvcr80-ruby18.dll と lib\ 以下を
全部 exe ファイルがあるディレクトリに突っ込んであります。

// TEST.cpp :

#include "stdafx.h"
#include <ruby.h>

#pragma comment(lib, "msvcr80-ruby18.lib")

int main (int argc, char **argv)
{
   ruby_init ();
   ruby_init_loadpath();
   rb_eval_string("require 'net/http'");
   rb_eval_string("Net::HTTP.get_print 'www.ruby-lang.org', '/index.html'");
   return 0;
}

327:デフォルトの名無しさん
07/05/15 14:11:15
C:\Documents and Settings\giko\My Documents\Visual Studio 2005\Projects\TEST\de
bug>TEST.exe
C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST/de
bug/lib/ruby/1.8/net/http.rb:560: C:/Documents and Settings/giko/My Documents/V
isual Studio 2005/Projects/TEST/debug/lib/ruby/1.8/net/http.rb:560:in `initializ
e': getaddrinfo: non-recoverable failure in name resolution. (SocketError)
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/debug/lib/ruby/1.8/net/http.rb:560:in `open'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/debug/lib/ruby/1.8/net/http.rb:560:in `connect'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/debug/lib/ruby/1.8/timeout.rb:48:in `timeout'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/debug/lib/ruby/1.8/timeout.rb:76:in `timeout'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/debug/lib/ruby/1.8/net/http.rb:560:in `connect'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/debug/lib/ruby/1.8/net/http.rb:553:in `do_start'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/debug/lib/ruby/1.8/net/http.rb:542:in `start'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/debug/lib/ruby/1.8/net/http.rb:374:in `get_response'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/debug/lib/ruby/1.8/net/http.rb:337:in `get_print'
        from (eval):0


328:デフォルトの名無しさん
07/05/15 14:33:26
ruby-win32って2005でコンパイルできるようになったのか・・・
俺が試した時は、できなくて、諦めたんだが

329:デフォルトの名無しさん
07/05/15 14:34:18
>>326
さすがに、DLLだけしかおいてないってことはないよね?

330:デフォルトの名無しさん
07/05/15 14:50:38
>>328
1.8.6 で(?)入ったそうです。1.8.5 はビルドできませんでした。

C:\Program Files\ruby\bin>ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32_80]

>>329
え? DLLとlib/以下しか置いていませんが……。
何か他に必要なんでしょうか?

あ、あと関係ないかもしれませんが、プロジェクトのプロパティで
C/C++全般の「追加のインクルードディレクトリ」に ruby のソースがある場所:
"C:\Documents and Settings\giko\デスクトップ\ruby-1.8.6\win32";"C:\Documents and Settings\giko\デスクトップ\ruby-1.8.6"

リンカ全般の「追加のライブラリディレクトリ」にインストールしたrubyの場所:
"C:\Program Files\ruby\lib\ruby\1.8\i386-mswin32_80";"C:\Program Files\ruby\lib"

を指定しています。

331:デフォルトの名無しさん
07/05/15 15:08:59
>>326
普通にそのrubyで
require "net/http"
Net::HTTP.get_print 'www.ruby-lang.org', '/index.html'
というスクリプトを実行したらちゃんと動きますか?

それから、関係あるかどうかわかんないけど、そのTEST.exeのrelease版を作って試したらどうなりますか?

332:デフォルトの名無しさん
07/05/15 16:43:53
libは入っているか・・・

前に、結局使わなかったんだけど、VC2003でコンパイルしたときに、
/MTとか/ML指定している(つまり、MSVCRTのDLLなしにすると)と、挙動不審になった
その時も、net関連が動かなかったような

333:デフォルトの名無しさん
07/05/15 17:19:24
>>332
今はそれやるとconfigure.batでエラーになると思う。

334:326
07/05/15 19:53:35
>>331

ruby 単体では、

C:\Program Files\ruby\bin>type test.rb
require 'net/http'
Net::HTTP.get_print 'www.ruby-lang.org', '/index.html'

C:\Program Files\ruby\bin>ruby test.rb
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
   "URLリンク(www.w3.org)
<html xmlns="URLリンク(www.w3.org)
  <head>
    <title>Oops! The page you were looking for could not be found.</title>
    <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" />
    <style type="text/css">
# snip

のように、普通に動いています。

後、releaseにしてプロジェクトのプロパティを同じにしてビルドしてみたところ、
ruby が SEGV してしまいました。


335:326
07/05/15 19:57:00

C:\Documents and Settings\giko\My Documents\Visual Studio 2005\Projects\TEST\re
lease>TEST.exe
C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST/re
lease/lib/ruby/1.8/net/http.rb:560: C:/Documents and Settings/giko/My Documents
/Visual Studio 2005/Projects/TEST/release/lib/ruby/1.8/net/http.rb:560:in `initi
alize': getaddrinfo: non-recoverable failure in name resolution. (SocketError)
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/release/lib/ruby/1.8/net/http.rb:560:in `open'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/release/lib/ruby/1.8/net/http.rb:560:in `connect'
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/release/lib/ruby/1.8/timeout.rb:48:in `timeout'
<snip>
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Pro
jects/TEST/release/lib/ruby/1.8/net/http.rb:337:in `get_print'
        from (eval):0
C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST/re
lease/lib/ruby/1.8/net/http.rb:560: [BUG] Segmentation fault
ruby 1.8.6 (2007-03-13) [i386-mswin32_80]


This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

C:\Documents and Settings\giko\My Documents\Visual Studio 2005\Projects\TEST\re
lease>

ruby のビルドの仕方がおかしいのでしょうか。>>326で言ったとおり、
特に変わったことはしていないのですが……。

336:デフォルトの名無しさん
07/05/16 00:33:33
>>334
> 普通にそのrubyで

337:326
07/05/16 01:04:55
>>336
こういうことでしょうか?

#include "stdafx.h"
#include <ruby.h>

#pragma comment(lib, "msvcr80-ruby18.lib")


int main (int argc, char **argv)
{
    ruby_init ();
ruby_init_loadpath();
rb_eval_string("require 'test'");
/*
rb_eval_string("require 'net/http'");
rb_eval_string("Net::HTTP.get_print 'www.ruby-lang.org', '/index.html'");
*/
    return 0;
}

338:326
07/05/16 01:06:43
<snip>
2007/05/16  01:00            40,960 TEST.exe
2007/05/16  01:00           315,220 TEST.ilk
2007/05/16  01:00           429,056 TEST.pdb
2007/05/15  08:38    <DIR>          lib
2007/05/14  22:06           663,552 msvcr80-ruby18.dll
2007/05/15  19:38                76 test.rb
<snip>

C:\Documents and Settings\giko\My Documents\Visual Studio 2005\Projects\TEST\debug>type t
est.rb
require 'net/http'
Net::HTTP.get_print 'www.ruby-lang.org', '/index.html'

C:\Documents and Settings\giko\My Documents\Visual Studio 2005\Projects\TEST\debug>TEST.e
xe
(eval): C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST/debu
g/lib/ruby/1.8/net/http.rb:560:in `initialize': getaddrinfo: non-recoverable failure in na
me resolution. (SocketError)
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST
/debug/lib/ruby/1.8/net/http.rb:560:in `open'
<snip>
        from C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST
/debug/lib/ruby/1.8/net/http.rb:337:in `get_print'
        from ./test.rb:2
        from (eval):0:in `require'
        from (eval):0

339:デフォルトの名無しさん
07/05/16 01:14:14
つかエラーメッセージ見る限り
C版では名前解決できてないんだよなこれ
www.ruby-lang.orgをIPアドレスにしたらどーなるんだろう

340:デフォルトの名無しさん
07/05/16 01:30:51
>>326
「そのruby」ってのはmsvcr80-ruby18.dll作ったときに一緒にできてるはずの
ruby.exeで、ってことだ。


341:デフォルトの名無しさん
07/05/16 01:38:07
RubyでDLLは作成出来ますか?


342:デフォルトの名無しさん
07/05/16 09:49:33
RubyはDLLにコンパイルされてるよ。

343:デフォルトの名無しさん
07/05/16 13:18:55
出来ない

344:326
07/05/16 14:34:33
>>340
>>339
221.186.184.68にして試してみましたが、rubyでのエラーメッセージが表示されるよりも前にデバッガに落ちてしまうようです。
release版だとこんな感じです。

C:\Documents and Settings\giko\My Documents\Visual Studio 2005\Projects\TEST\release>TEST.exe
C:/Documents and Settings/giko/My Documents/Visual Studio 2005/Projects/TEST/release/lib/ruby/1.8/net/http.rb:560: [BUG] Segmentation fault
ruby 1.8.6 (2007-03-13) [i386-mswin32_80]

>>326で書いたとおり、msvcr80-ruby18.dllはProgram Files\ruby\bin\からぱくってきているのです……。



345:デフォルトの名無しさん
07/05/16 17:28:15
> C\:Program Files\ruby の bin\ から msvcr80-ruby18.dll と lib\ 以下を
> 全部 exe ファイルがあるディレクトリに突っ込んであります。

見落としていた。
つまり、公式配布のwin32版のDLLってこと?


346:326
07/05/16 19:25:41
>>345
公式配布(というか、配布されているものはほとんど)vc6でビルドされていますが、
それだと組み込みを行った時に"MSC version unmatch"とVS.NETに怒られるので、
VS.NET 2005 で独自にビルドしたものを使っています。それがProgram Files\ruby
に入っており、そこからコピーしたものを組み込もうとしています。

347:デフォルトの名無しさん
07/05/16 19:41:00
そんだけバラバラで動くほうが奇跡だな

348:デフォルトの名無しさん
07/05/16 20:30:43
win32版は、ruby_init以外に
NtInitializeを呼ぶ必要がある。

349:326
07/05/16 21:45:23
>>348
すばらしい!ありがとうございます!

TEST.cpp を

#include "stdafx.h"
#include <ruby.h>

#pragma comment(lib, "msvcr80-ruby18.lib")


int main (int argc, char **argv)
{
    ruby_init ();
ruby_init_loadpath();
NtInitialize(&argc, &argv);
rb_eval_string("require 'net/http'");
rb_eval_string("Net::HTTP.get_print 'www.ruby-lang.org', '/index.html'");
    return 0;
}

のようにしたところ、問題なく取得できました。
重ねて、ありがとうございました。

350:デフォルトの名無しさん
07/05/16 22:06:07
>>349
> ruby_init ();
> ruby_init_loadpath();
> NtInitialize(&argc, &argv);

順序逆だろ。

351:デフォルトの名無しさん
07/05/16 22:09:30
>>349
おお!動いてよかったね

352:326
07/05/16 22:15:06
>>350
orz。不勉強で申し訳ない。適当に入れたら動いてしまったので思わず興奮して
書き込んでしまいました。重ねて、ありがとうございました。

>>351
ありがとー。

353:デフォルトの名無しさん
07/05/17 01:42:01
えとぉ…毎度初心者ですまないんだが、クラスメソッドってありますやん?
オブジェクトを生成せずにメソッドだけ強制的に実行するわけですよね?(誤解してるかもしれないけども)
んで、それってさ、つまり初期化されて無いって事は、そのクラスメソッドがいくら長くなろうとも、似たルーティンがあろうとも、そのクラス無いの別メソッドを呼び出しできないって事なのん?
こんな感じに書いたんですが…
class Hoge

def a
return 1
end

def Hoge.hoge()
num = a
return num
end

end

obj = Hoge.hoge

354:デフォルトの名無しさん
07/05/17 05:04:12
class Hoge
  class << self
    def a
      return 1
    end

    def hoge()
      num = a
      return num
    end
  end
end

obj = Hoge.hoge

355:デフォルトの名無しさん
07/05/17 06:07:24
>>353
初期化されてないも何も、クラスメソッドはそのクラスオブジェクトの特異メソッドであって、
インスタンスのメソッドじゃないよ。

つってもわからんか…。

Hoge.hoge()

の例で行くと、Hogeがクラスオブジェクト(Classクラスのインスタンス)なんですよ。
Hogeがオブジェクトなんです。Hogeはどのクラスに属しているかというと、
p Hoge.class #=> Class
ということになります。リファレンスマニュアルを開くとわかると思うけど、
Classというクラスが存在しています。で、HogeはそのClassクラスのインスタンスというわけです。
で、hogeは何かというと、オブジェクトHogeの特異メソッドというわけです。
Hogeというオブジェクトのメソッドだから Hoge.hoge() と呼ぶわけです。
実際にhoge()の中でp self.classと1行加えると「Class」と出力されるでしょう。

ここでメソッドaは何かというと、クラスHogeの(インスタンス)メソッドです。
なのでメソッドaを呼ぶにはHogeオブジェクトが必要になります。
ここで、メソッドaの中で p self.classと1行加えて、
たとえばHoge.new.aとやると「Hoge」と出るはずです。

というわけで、インスタンスメソッドとクラスメソッドは全く異なるクラスに属しているということになります。
なので呼べません。

356:デフォルトの名無しさん
07/05/17 09:15:48
この場合はむしろ
「なぜ普段メソッド内でaという関数なカタチでメソッドを呼べるのか」
ってとこから理解深めたほうが

357:デフォルトの名無しさん
07/05/17 11:07:07
ああ!!なるほd・・・・・あぁ?
すまん、354のソースもお手数ですが解説いただけないか。。。

358:デフォルトの名無しさん
07/05/17 11:32:57
Rubyは << にいろいろな意味負わせすぎで困る

359:デフォルトの名無しさん
07/05/17 12:00:44
Javaだとnewでインスタンスを作らせたくないクラスはコンストラクタを
privateにする事でできるのですが、Rubyでinitializeメソッドを
private指定にしてもnewできてしまいました。

newからインスタンスを作る事を禁止するスタンダードな方法ってありますか?


360:デフォルトの名無しさん
07/05/17 12:54:15
>>358
C++のインスパイアです。

361:デフォルトの名無しさん
07/05/17 13:01:21
>>359
newをprivateにする

class Hoge
  class << self
    private :new
  end
end


362:デフォルトの名無しさん
07/05/17 13:02:17
というか、インスタンスを作らせたくなくないならクラスにしなきゃいいと思うけど。


363:デフォルトの名無しさん
07/05/17 13:02:54
>>359

class Hello
  def initialize
    puts "OK"
  end
end

Hello.new    #=> OK

class << Hello
  private :new
end

Hello.new   #=> NoMethodError: private method `new' called for Hello:Class


364:デフォルトの名無しさん
07/05/17 13:18:46
しかし、>>363の続きに

class << Hello
 public :new
end

と書けてしまうから、privateにする甲斐もあまりないな。

365:デフォルトの名無しさん
07/05/17 13:20:21
>>357
>>354のメソッド定義は、こう書いたのとほぼ同じ

class Hoge
def Hoge.a
return 1
end

def Hoge.hoge()
num = a
return num
end
end

obj = Hoge.hoge

つまりaとhogeは、両方ともクラスメソッド

>>359
ClassじゃなくてModule使うんじゃダメなの?

366:デフォルトの名無しさん
07/05/17 15:32:16
「インスタンスを作らせたくない」って異常だよな
自動でインスタンス作る機構でも入れてんだろか

367:デフォルトの名無しさん
07/05/17 15:37:46
別に異常ってことはないだろ。
てかJava知らん奴が無駄に突っかかるなと。

368:デフォルトの名無しさん
07/05/17 16:07:32
GoF4のデザインパターンまわりにインスタンスを作らせたくない
ケースはごろごろありそうだけど。

369:デフォルトの名無しさん
07/05/17 16:47:00
要するにJavaの言語仕様上の要求から出て来るだけで、Rubyだとほとんど意味
をなさないパターンだな。

一応singleton.rbというのもあるけど。


370:デフォルトの名無しさん
07/05/17 16:50:04
どちらにせよ359の目的が分からんとなんとも言えん

371:デフォルトの名無しさん
07/05/17 19:30:47
Windows環境で スクリプト中に ディレクトリ名などを含めたいとき
ディレクトリ区切り記号が バックスラッシュなので
たとえば
path = "c:\\tmp\\"
のように \\ふたつ重ねで 書く必要がある
あるいは
path = "c:/tmp/"
のように バックスラッシュの代わりに スラッシュに置き換える必要がある.
…でも
私の場合, こういったパス名は ほとんどの場合, Explolerから コピペしてくるので
長いパス名だと \ を 間違えないように \\ とか / に置き換えるのが面倒だし
第一, 見た目にも \だらけで やさしくない.
C# みたいに @"c:\tmp" って書けるような 文字列リテラル書式って
ないんでしょうか?

372:デフォルトの名無しさん
07/05/17 19:31:00
作らせないってどういう時に使うんですか?

シングルトンとか?
あとは、Factoryを介してほしいときとかかな?

373:デフォルトの名無しさん
07/05/17 19:32:31
>>371
%q(c:\hoge\mage)
ではダメですかね?

374:matz
07/05/17 19:33:47
Windowsのような糞OSのための特殊仕様なんてありませんし

   あ り え ま せ ん 



375:デフォルトの名無しさん
07/05/17 19:40:25
>>373
ちょっとやってみると…
%q(c:\tmp\)
では エラーでした.
%q は すべてのバックスラッシュ記法を無効にするというわけでは
ないみたいですね


376:デフォルトの名無しさん
07/05/17 20:29:07
>>375
%q(c:¥tmp)
なら問題ないかと

377:デフォルトの名無しさん
07/05/17 21:24:32
>>376
そうですね.
調べてみると…

シングルクォート or %q 記法では ほとんどのバックスラッシュは そのまま書けるけど
文字列の最後だけは エスケープの必要があるようです.

ちなみに…私がpath名の最後に \ をつけたいのは
見てすぐ ディレクトリ名だと思う …ってのと
後で ファイル名を くっつける時に楽だから…という理由で, わりとよくつけるのでした.
まぁ これくらは 慣れでなんとかやっていけそうです.

以上, ありがとうございました>コメントくれた人々


378:デフォルトの名無しさん
07/05/17 21:43:08
>文字列の最後だけは エスケープの必要があるようです.
じゃなくて、「'」とか「)」とかの文字列閉じるやつを
バックスラッシュがエスケープするからだと思われ
unterminated string meets end of fileって叱られたし

379:デフォルトの名無しさん
07/05/19 01:22:40
["a", "b", "a", "c"] から ["a", "b", "c"]を得たいのですけども、
Array#uniq じゃダメですよね。
どうするのが手軽で良いでしょうか。

380:MoonWolf ◆MoonWdLnkQ
07/05/19 01:41:33
["a", "b", "a", "c"].uniq.sortでいいんじゃない?


381:デフォルトの名無しさん
07/05/19 01:43:16
uniqでよい

ただ、おそらくは例が悪くて

irb> arr = ["c", "b", "a", "a"]
=> ["c", "b", "a", "a"]
irb> arr.uniq
=> ["c", "b", "a"]

これを一発で ["a", "b", "c"] にしたいという話だと推測
適当に sort するしかないな

ref = ['北海道', '青森', '秋田', '岩手'] # 順番を記述した配列
arr = ['青森', '岩手', '北海道', '北海道', '秋田'] # 整頓したい配列
puts arr.uniq.sort_by{|a| ref.index(a)}

北海道
青森
秋田
岩手


382:デフォルトの名無しさん
07/05/19 01:58:04
今ふっと思ったんだけど、puts [1,2,3,4]って
1234

であるべきじゃね?
1
2
3
4

になってる現状っておかしくね?
なんで配列の場合だけ配列を生かして印字するん?
ハッシュは前者のように印字するのに。

383:MoonWolf ◆MoonWdLnkQ
07/05/19 02:05:30
>>382
to_sの結果と違うから、ちょっと困るね。
ハッシュをputsした場合、キーの順序が不定になってうまく動かない気が。。。


384:デフォルトの名無しさん
07/05/19 02:09:55
>>382
だいぶ前に開発版で一瞬だけ前者のようになったことがあり
URLリンク(blade.nagaokaut.ac.jp)
速攻で元に戻った

配列の場合だけ特別にやってるみたい
ごく初期の便利機能っぽい雰囲気が残ってる
「join("\n")しなくてもputs単体でもイケます」みたいな

.join("\n") の11文字タイプするのすら面倒な書き捨てスクリプトでない限り
よい子はこれに頼らないほうがよいかと…

385:デフォルトの名無しさん
07/05/19 02:36:38
.join("\n") より *"\n" を選ぶオレはgolf脳。
もちろん \n は生の改行文字に置き換えます。

386:デフォルトの名無しさん
07/05/19 02:40:08
puts(*ary)

387:デフォルトの名無しさん
07/05/19 02:57:17
>>385
そんなん初めて知った

388:デフォルトの名無しさん
07/05/19 08:41:54
>>385
できた。すげえ

389:デフォルトの名無しさん
07/05/19 08:57:18
>>386
なるへそ
となると、putsの便利機能とやらは、もはやほとんど不必要なわけか

390:デフォルトの名無しさん
07/05/19 09:24:47
puts(nil) の特別扱いも要らないよなぁ

391:MoonWolf ◆MoonWdLnkQ
07/05/19 10:54:10
"\n"よりも$/のほうが短くね?


392:デフォルトの名無しさん
07/05/19 11:02:19
一行目しか読めねぇのかよこのデブが!

393:デフォルトの名無しさん
07/05/19 11:04:06
配列のタプルへの変換は常識

394:デフォルトの名無しさん
07/05/19 11:34:38
タプタプするとか言うな殺すぞデブ!

395:デフォルトの名無しさん
07/05/19 11:35:56
んでタプルって何?

396:デフォルトの名無しさん
07/05/19 11:43:45
マニュアルの Rinda::Tuple には…書いてないな

397:MoonWolf ◆MoonWdLnkQ
07/05/19 12:00:14
>>392
>>391のこと?
\nを生の改行コードにしても3バイトだよね。
$/なら2バイトだよ。
改行コードが\r\nでもうまく動くから$/のほうがいいな。


398:デフォルトの名無しさん
07/05/19 13:00:18
>\nを生の改行コードにしても3バイトだよね。
>$/なら2バイトだよ

\n も $/ どちらも2バイトなような気がする…
生の改行コード、がわからない orz

399:デフォルトの名無しさん
07/05/19 16:10:59
"改行
"
で3バイトってことかな。


400:デフォルトの名無しさん
07/05/19 16:11:43
その伝だと、"¥n"は " ¥ n " で4バイトだね。

401:デフォルトの名無しさん
07/05/19 16:17:01
引用符なしで直接 \n って書いたら、"\n"のことだと見なしてくれたら便利だな

402:デフォルトの名無しさん
07/05/19 16:22:50
お前は puts の話でいったい何を得たんだ(w

403:デフォルトの名無しさん
07/05/19 16:29:35
最後に改行が付いてる文字列を puts したら
改行 1 個しか出力されない仕様はどうかと思うんだ。

404:デフォルトの名無しさん
07/05/19 16:32:29
>>403
puts は「適当に改行を補って表示する」メソッドです(chomp が適当に改行取るのと似たような感じ)
常に改行を補いたい場合は print str + "\n" と明示的に書いてください

というのはどうだろう

405:デフォルトの名無しさん
07/05/19 16:35:48
ファイルにputsしたら駄目だよな
putsは入力と出力が必ずしも一致しない

putsは再現度の重要度の低い画面表示向け

406:デフォルトの名無しさん
07/05/19 16:51:04
Ruby2.0ではputs a, b, cで改行無しにくっつけて表示してもらいたい

407:デフォルトの名無しさん
07/05/19 16:59:45
>>406
print使え

408:デフォルトの名無しさん
07/05/19 18:38:18
>>403

実際にやってみたけど普通に改行2つでるよ?
何か勘違いしてるのかなぁ。

str = "hoge\n"
puts str

----

409:デフォルトの名無しさん
07/05/19 18:40:27
>>408

410:デフォルトの名無しさん
07/05/19 18:52:53
試験の要件を満たすプログラムを作成できるようになるための勉強ってやっぱ必要だよな

print "---------------------\n"
str = "改行なし"
puts str
print "---------------------\n"
str = "改行あり\n"
puts str
print "---------------------\n"


411:デフォルトの名無しさん
07/05/19 20:15:47
>>403
げ、本当だw

> ruby -e 'puts "str"'
str
> ruby -e 'puts "str\n"'
str
>

412:デフォルトの名無しさん
07/05/19 20:28:43
これも「どんな文末でも必ず改行つきで表示する」ならそれはそれでいいんだけどな

$ ruby -e 'puts "str"' | cat -n
1 str
$ ruby -e 'puts "str\n"' | cat -n
1 str
$ ruby -e 'puts "str\n\n"' | cat -n
1 str
2
$ ruby -e 'puts "str\n\n\n"' | cat -n
1 str
2
3

機械的に1回chompしてるだけじゃねーか(w

413:デフォルトの名無しさん
07/05/19 20:57:30 BE:199851124-2BP(0)
rubyで配列に対して同じものが何回出たか一言で数える方法ってありますか?
uniq -c みたいな

414:デフォルトの名無しさん
07/05/19 21:11:04
a=[1,1,2,2,3]; a.size - a.uniq.size

こんな感じ?

415:デフォルトの名無しさん
07/05/19 21:22:37
arr=[1,2,2,3,3,3,4,4,4,4]

arr.uniq.each do |e|
same_elements = arr.find_all{|e2| e == e2}
puts "#{e}は#{same_elements.size}回"
end

-------------

1は1回
2は2回
3は3回
4は4回

こんなん?

416:デフォルトの名無しさん
07/05/19 22:08:39
a.inject(Hash.new(0)) { |hash, e| hash[e] += 1; h}

なんかでじゃぶを感じる。


417:デフォルトの名無しさん
07/05/19 22:09:30
× h
○ hash


418:デフォルトの名無しさん
07/05/19 22:15:03
h=Hash.new(0);a.each{|e|h[e]+=1};p h

419:デフォルトの名無しさん
07/05/19 22:19:36
みんな騙されるな!
>>418は3行分だぞ!

420:デフォルトの名無しさん
07/05/19 22:32:34
てか>>416のinjectをバラしてeachにしたのが>>418のような気も…

ハッシュ作って登録しながらカウントというのはよくある手法だな
>>415みたいに素直に毎回サーチすると、対象の配列がデカいときに困ったことになる
…はずだ

421:デフォルトの名無しさん
07/05/19 22:44:05
>>415と同じようなfind_allの方法しか思いつかなかった俺は修行不足のようだ

422:413
07/05/19 22:53:19 BE:674495093-2BP(0)
ありがとうございます
cat foo.txt | sort |uniq -c みたいな感じです。

a.uniqがあるので何か一言で書く方法があるのかなと思いましたが
プログラム組まないと駄目ですよね。

423:デフォルトの名無しさん
07/05/21 10:06:59
scrapiを使おうとしました。
gem install scrapiでインストールして、

#!ruby -Ks
SRC_URL = "URLリンク(d.hatena.ne.jp)

require 'rubygems'
require 'scrapi'
require 'open-uri'
require 'pp'

links = Scraper.define do
 process "a[href]", "urls[]"=>"@href"
 result :urls
end.scrape(URI.parse(SRC_URL)).sort.uniq

pp links

以上のソースを実行したところ、

---------------------------
ruby.exe - 正しくないイメージ
---------------------------
アプリケーションまたは DLL (Rubyを入れたディレクトリ)ruby\gems\1.8\gems\scrapi-1.2.0\lib\tidy\libtidy.so は
正しい Windows イメージではありません。これをインストール ディスクのファイルと照合してください。
---------------------------
OK
---------------------------

というダイアログが出てしまいます。
実行結果は、きちんとでているようです。

424:423
07/05/21 10:09:45
RUBYOPT = -rubygems
は、環境変数で指定してあります。

このダイアログがいちいち出てしまうのですが、出ないようにすることはできないでしょうか?

なお、cygwinのbash上から実行した場合は、何故かダイアログがでません・・・。


425:423
07/05/21 10:16:20
自己解決っぽいです。

検索してみると、どうも、libtidy.soがlinux用らしくて、

3 日坊主日記 - scrapi - ScrAPI toolkit for Ruby
URLリンク(moriq.tdiary.net)

によると、win32用のdllが先に読まれないようなので、

ruby\lib\ruby\gems\1.8\gems\scrapi-1.2.0\lib\tidy\libtidy.so

libtidy.so.0あたりにリネームしてやると、
libtidy.dllが読まれて、ダイアログが出なくなりました。


426:デフォルトの名無しさん
07/05/21 16:07:18
腐ったgemだな。 > scrapi
本来入ってるはずでないlibtidyまで適当にぶちこんでるのか。




427:デフォルトの名無しさん
07/05/21 16:15:58
そうなのか?
Cygwinでエラーにならないのはなんで?

428:デフォルトの名無しさん
07/05/22 14:53:22
cygwin用のtidyが入ってんじゃない?

429:デフォルトの名無しさん
07/05/22 22:43:06
すみません。
正規表現Regexpでヒットした複数行をtxtファイルに書き込んで保存したいのですが、
良い方法ありませんか?

$stdout = File.open("xxxx.txt", "w")
というのでやってみたところ、
最初の一行と途中のやつが文字化けで現れるだけなんですが。。。

FAQにあったらごめんなさい。

430:デフォルトの名無しさん
07/05/22 22:57:22
>>429
a1. 正規表現で複数行マッチさせ変数に保存
a2. 複数行マッチした結果の変数の内容を画面に表示させ確認する

b1. 複数行の文章を手入力し変数に入れておく
b2. 複数行の文章を適当なファイルに保存、エディタなどで確認する

上記aとbを組み合わせ、
「正規表現で複数行マッチしたものを変数に入れその変数をファイルに書き出す」
ということをする
まずは一つ一つ成功させて積み重ねれ

431:デフォルトの名無しさん
07/05/22 23:03:21
ありがとうございます
入門書読みながら格闘してきます

432:デフォルトの名無しさん
07/05/23 21:50:58
あるmoduleのメソッドを別のモジュールでも使いたいと思い

module A
 def hoge puts "hoge"; end
end

module B
 include A
end

としたのですが、includeはクラスにのみ作用するようで、B.hogeとしても
NoMethodErrorとなってしまいました。

この辺りはRubyのメタプログラミングを理解する上でとても重要だと思うのですが、
どうもその辺りが理解がまったくできていないようです。

知る限りではmodule_evalなどがあるのですが、それも上手く行きませんでした。。
この場合はどのように処理すればよいのでしょうか?

 

433:デフォルトの名無しさん
07/05/23 22:02:56
includeはたぶん普通に行えています。
B.hogeのようなカタチで使用するには、Bの定義内で
module_function :hogeする必要があります。

434:デフォルトの名無しさん
07/05/23 23:23:10
そもそもそれじゃ A.hoge 自体できないだろうが。

435:デフォルトの名無しさん
07/05/24 01:51:17
>432
そもそも、そのコードじゃA.hogeも呼べなくね?
まぁB.hogeしたいなら、単にextendすればいいんじゃね。

436:デフォルトの名無しさん
07/05/24 02:32:34
>>432
メタプログラミングを理解する前にやっとくべきことがいろいろとありそうだな…。

437:デフォルトの名無しさん
07/05/24 08:09:29
module A
def hoge; puts "hoge"; end
end

module B
extend A
end

B.hoge

438:デフォルトの名無しさん
07/05/24 11:02:00
>>434-436
Aの方にclass << selfを入れ忘れ... orz
hogeメソッドはAのクラスメソッドのつもりでした。

>>437
ありがとうございます。できました!
Bの特異クラス?に対してincludeするって事なんでしょうか。
継承って言うより注入って感じだなぁ。。。

>>433
ありがとうございます。
includeだとインスタンスメソッドになってるから
module_functionでクラスメソッドに変えるって事なんでしょうか。
今回は>>437で行きたいと思います。


439:デフォルトの名無しさん
07/05/24 21:56:58
CGIでCookieを使おうと思ってマニュアルを頑張って読む。

URLリンク(www.ruby-lang.org)
> require "cgi"
> cgi = CGI.new
> for name, cookie in cgi.cookies
> cookie.expires = Time.now + 30
> end
> cgi.out("cookie" => cgi.cookies){"string"}

…。わかりにくいです先生。

440:デフォルトの名無しさん
07/05/24 23:29:17
require 'cgi'
cgi = CGI.new
now = Time.now

mycookie = cgi.cookies['accesslog'] # クライアントから受け取ったクッキー
unless mycookie.empty?
mycookie.value.push(now.to_s) # 既存のクッキーがあるなら時刻を追加
else
# クッキーが空の場合新規作成
mycookie = CGI::Cookie::new({ 'name' => 'accesslog',
'value' => [now.to_s], # 必ず文字列入り配列
'domain' => cgi.server_name,
'path' => cgi.script_name })
end
mycookie.expires = now + 60
cgi.out({'cookie' => mycookie}){"#{mycookie.join('<br>')}"}


わかりやすいサンプルって難しいな

441:デフォルトの名無しさん
07/05/25 03:08:39
Cookieの分かりにくさはRubyのせいじゃないからなぁ


442:デフォルトの名無しさん
07/05/25 03:38:13
1. ブラウザが'accesslog'という名?のクッキーを要求して来てます
2. 机にクッキー置いてあった => 時刻も付けとく
  机の上にクッキーなかったり => 新しく袋から出して、時刻も付けとく
3. 賞味期限を60日に設定 expire
4. とっとと、どうぞ召し上がっちゃってください

1. のとこの'accesslog' の辺りが よくわからないぽ …orz

'accesslog'いうのはキャッシュに保存されてるファイル名か
なにかなのかな?

443:デフォルトの名無しさん
07/05/25 11:26:02
Moduleのインスタンスは、作成した時点ではnameが""で
定数に代入するとその定数名がnameに設定されますが
これと同じことを自作クラスのインスタンスでも実現出来るでしょうか?

444:デフォルトの名無しさん
07/05/25 18:15:40
>>442
これはコメントがよくない


# クライアントから送りつけられた全クッキーの中からaccesslog名義のデータを取り出す
mycookie = cgi.cookies['accesslog']

   :
   :
   :

# 変更したクッキーをクライアントに返し、HTMLでaccesslogの値を<br>で区切って表示する
cgi.out({'cookie' => mycookie}){"#{mycookie.join('<br>')}"}


これならわかりやすい…かも
サーバー側は送ってもらうクッキーの名前を選べない
クライアントからはdomainとpathが一致するものを全て一気に送ってくる
(だから、変なのを濫造すると接続時に100項目くらいどばっと送られてくる羽目に)


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch