[表示 : 全て 最新50 1-99 101- 201- 301- 401- 2chのread.cgiへ]
Update time : 05/09 09:59 / Filesize : 99 KB / Number-of Response : 425
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Rubyについて Part 33



1 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 16:10:50 ]
オブジェクト指向スクリプト言語Rubyについて扱うスレッドです。

Ruby Home Page
www.ruby-lang.org/ja/

= 前スレ
Rubyについて Part 32
pc11.2ch.net/test/read.cgi/tech/1215531152/

過去スレ・関連スレは >>2-

231 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 01:14:49 ]
>>225
そっちでいくなら ruby -c で終了コードを見た方が。

> ruby -ce 'p 0' || echo error
Syntax OK
> ruby -ce 'p 0.' || echo error
-e:1: syntax error, unexpected $end
error


232 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 03:35:41 ]
お前ら、ちょっとくらいソースのぞいてみろ。
sample/test.rbにそのまんまのがある。

def valid_syntax?(code, fname)
code = code.sub(/\A(?:\s*\#.*$)*(\n)?/n) {
"#$&#{"\n" if $1 && !$2}BEGIN{return true}\n"
}
eval(code, nil, fname, 0)
rescue Exception
puts $!.message
false
end


233 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 11:23:07 ]
がんばってみたけどやっぱりダメみたいだ。

ごめんなみんな。

234 名前:223 mailto:sage [2008/11/18(火) 13:02:24 ]
>>224
レスありがとうございます
思った通りに処理できるようになりました

235 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 03:03:37 ]
国籍法改正案について語ろうぜ

236 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 03:29:00 ]
>>235
mamono.2ch.net/newsplus/

237 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 03:30:35 ]
+(笑)

238 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:28:32 ]
Ruby-Gnome2にはお世話になってるので、GUIに関するアンケートに答えたけど、
英語が苦手なのできつかった。。

239 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:16:02 ]
what?



240 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:30:32 ]
これこれ
blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/45649

241 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 09:47:40 ]
thanks. (あれ?一度レスしたつもりだったが、してなかったか)

242 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 11:09:42 ]
メソッド呼び出しの括弧を省略したらProcオブジェクトが
とれるようにしようぜ
今みたいに関数オブジェクトを名前で指定するって
ダサすぎね?

243 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 11:58:49 ]
それは何を中心に考えるかによるからなあ。プロパティ指向と考えれば今のもあり。

それより、
Rubyって関数とかブロックとかクロージャ類の扱いがなにげに冷遇されてるというか
あんまりきちんと整理されていないというか。
他の言語でクロージャ使って書くつもりのことがRubyだとすんなり書けないね。

表層的には
・ブロックが関数と同等でない(ブロックをとれないなど)
・内部関数(Schemeのinternal defineみたいの)を書けない

Rubyという言語の設計において、クロージャ類は従属的な存在なんだと思う。

244 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 13:03:31 ]
>242
名前っつーか、そのためのシンボルのハズなんだが
ちとシンボルと実体が疎に過ぎる気はするなあ。

>243
Rubyに純粋な意味での「関数」は無いからね。
文の塊をつくる手段は所属するオブジェクトが必要な「メソッド」と
オブジェクトそのものである「ブロック/Proc」の2種類。



PythonやJavaScriptみたいな設計は
「publicな属性が存在する」ことが前提。
「メソッドはpublicな属性に、クロージャが入ったもの」という感じ。
この設計では、関数もメソッドも似たような存在。

ところがRubyはpublicな属性をいきなり排除して
「オブジェクトの属性にはメソッドを通してしかアクセス出来ない」
としてるから、その設計が出来ない。
というのもRubyで「メソッド=クロージャ」…としてしまうと
public属性にアクセスできない=クロージャにもアクセスできなくなるんだよね。

だからRubyがpublic属性を否定する限り
メソッドは特別な存在でなければならず、クロージャではありえない。
…お陰で、相対的にクロージャの地位が下がっちゃってる。

245 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 13:07:21 ]
ただ、もう少しProcとメソッド双方歩みよって
「違うけど、似たように扱える」仕組みがあっても良いとは思う。

246 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 20:25:17 ]
メソッド呼び出しの括弧の省略を許す限りなかなか難しいだろうなあ

247 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:20:48 ]
フリーの統合開発環境「NetBeans 6.5」正式版リリース

248 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 02:07:28 ]
メソッドをProcにするのなんか、
x = proc {obj.foo}
でいいんじゃね?

249 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 04:22:24 ]
1.9だと ブロック引数にデフォルト値の指定ができるし、ブロックも渡せる
block=lambda{|a,b=2,&c| p [a,b,c.yield]}
block.call(1){'block'} #=> [1,2,'block']

もう、いっそのこと {|| 〜} って書いたら、それはProcとして扱ったらいいんじゃね?




250 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 04:41:37 ]
あと、素人の浅知恵&妄想だが
selfを省略した括弧付きのメソッド呼び出しに限定して
メソッドが存在しない時に、同名の変数があって
それがProcオブジェクトなら call する
同名変数が存在しないか、変数がProcオブジェクトでなければ method_missing

今だって
def a;'def a';end
a = 'var a'
なんてしたときは 字面の a だけをみても変数なのかメソッドなのかわからんのだし
p a, a()
で、呼び分けるんだから a()がメソッド呼び出しなのか
変数aのProcオブジェクトをcallしてるのか判らなくてもいいんじゃね
a = lambda{'proc a'}
p [a, a(), a.call] # => [#<Proc:〜 (lambda)>, "def a", "proc a"]
で呼び分けれるし


251 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 04:49:18 ]
で、
alias func lambda
などとすれば
x = func{p 'function'}
x()

あらまぁ、もはや関数と見分けがつかない
なんちゃって


252 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 05:54:47 ]
>selfを省略した括弧付きのメソッド呼び出しに限定して
selfじゃなくてレシーバの省略だった

おまけで
__proc__みたいな感じでProc自身が取れたりすると
Procの再帰がさせやすくなったり


253 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 15:42:42 ]
>>250
> 今だって
> def a;'def a';end
> a = 'var a'
> なんてしたときは 字面の a だけをみても変数なのかメソッドなのかわからんのだし

これはメソッドaの有無にかかわらず常にローカル変数になるんじゃないか?

254 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 16:47:35 ]
代入があればローカル変数
そうでなければメソッドaの呼び出し

255 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 12:30:01 ]
先生、アンケートです。

あるデータから引数に該当するオブジェクトを検索抽出するメソッドがいくつかあります。
該当が無かった場合は nil やら空配列 [] やらが返ります。

で、このメソッドはブロックをとります。

data.search(cond){|e|
e.process
}

こんな感じで、抽出したオブジェクトのメソッドを使った処理をブロック内でしたいです。んで、このブロックは

 ・ 該当オブジェクトを探せなかったときには何もしないで処理を継続させる(抽出失敗はここではわからない)
 ・ 該当オブジェクトを探せなかったときにも nil を渡して NoMethodError でそれを報せる

のどっちがいいかな?

String#match なんかは前者で、ブロック内で作った変数が空かどうかでマッチの成功失敗を調べたりするよね

256 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 12:38:10 ]
>>255
前者はエラートラップ不要で手軽。
後者は込み入った処理ができる。どっちもどっちだと思う。

そのメソッドの用途によるけど、マッチしなかったときの処理が
重要になるかどうかで決めつけていいんじゃない?


257 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 12:54:51 ]
うん、どっちも採用理由があるなあ、とは思った。
どっちにしても、失敗検知用の if 文みたいなのはいるなーとか。

いや、これ、他人様のライブラリの便利メソッドの挙動なんだよね。
現行は後者なんだけど、前者のほうが便利なんじゃないかという気がひしひしと…。

「偽や空が渡ったら規定の例外を吐くブロック」とかないかなあ。
ああ、この便利メソッド自体が nil だったとき特定の「DataNoMatchError」とか吐けばいいのか。
場合によっては抽出失敗はしょっちゅう起こるし、そんな細かい例外も面倒だなあ。
でも「nil がどっかで出た結果、あのへんの処理が滞りました」としかわからない現状よりは、
特定の例外でエラー情報がわかったほうが便利なのかも。

…ありがとう。ちょっと考えてみる。
ちなみに、HTML から特定の要素や属性を抽出するメソッドです。サーバの HTML が変わって要素が無くなったら nil。

258 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 13:05:52 ]
「そんなん見ればわかるわボケ」という例外はイライラする
捕捉する機会があれば便利なのかもしれないが、普通の人はこんなん捕捉しないだろうな、みたいな

259 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 19:57:39 ]
Ruby/DBI のプリペアドステートメントで使える変数の個数に制限ってありますか?
変数9個の場合なんですが、

mysql = DBI.connect(ry
mysql.execute("SET NAMES utf8")
mysql.execute("INSERT INTO example_table (a, b, c, d, e, f, g, h, i) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)", var1, var2, var3, var4, var5, var6, var7, var8, "ENCRYPT(var9)")

というような文を実行すると、

Too many SQL parameters (RuntimeError)
from /usr/lib/ruby/1.8/DBD/Mysql/Mysql.rb:569:in `execute'
from /usr/lib/ruby/1.8/dbi.rb:893:in `execute'

というエラーになります。
また、Ruby/DBI を使う上でのドキュメントを探しているのですが、

Ruby DBI モジュールを使う
www.jiubao.org/ruby-dbi/ruby-dbi.html

以外でおすすめがあったら教えてください。



260 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 21:04:55 ]
>>257
searchって名前で検索抽出するのに、抽出失敗時にもブロック呼ぶの?
変だろうそれは。
探すのと辿るのでは目的が違うんだから、全部辿って何かしたいなら
foreach とか scan とか search_all とか、そんな名前にすると思うけど。

261 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 21:12:55 ]
>>259
実は MySQL の制限だったりしないかと思ったりしつつ。
irb(main):005:0> db = DBI.connect("dbi:sqlite3::memory:")
irb(main):006:0> db.do("create table tt (a1 integer, a2 integer, a3 integer, a4 integer, a5 integer, a6 integer, a7 integer, a8 integer, a9 integer, a10 integer, a11 integer, a12 integer)")
=> 0
irb(main):007:0> db.do("insert into tt values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", *(1..12))
=> 1
irb(main):008:0> db.select_all("select * from tt")
=> [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]


262 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 21:39:49 ]
search って名前ではないだろう、さすがに
いやわからんけど

263 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 15:09:38 ]
便利メソッドだってのがポイントかね
Array#findでなんとかなるけどこれを使うと何か便利、みたいな

264 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 17:29:39 ]
data.traverse do |t|
 t.match do |e|
  e.process
 end
 t.failure do |e|
  ...
 end
end

みたいなインタフェースはどうだろう。
自分で言うのも何だけど、match/failureって名前でいいのかとは思うがそれは置いといて。

265 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 17:59:25 ]
ちょいと質問。

HTMLのリンクとか面倒な部分をカンタンな記述→複雑なデータのように自動で変換記述する自分用スクリプト作ってます。
Wiki の [[キーワード]] みたいなやつ。
pstore の DB つきで、[[hoge-12]] と書いたら DB 内の Hoge の 12 項の説明文つきリンクで置き換わる、みたいな。

で、置換なんだけど、一般的に、ファイル全体に対して置換ワードごとに何度も gsub するしかない?

266 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 18:02:03 ]
>>265
str.gsub(/\[(.*)\]/) {|s| table[s] }
こんな感じ。

267 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 18:03:00 ]
てきとーに書きすぎたw
リファレンス見ながら察して。

268 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 18:08:16 ]
初めのころはgsubで書いて、
そのうちcase文とかif文とかの使用を考えて、
大量の一時状態保持変数とバカみたいに複雑な分岐処理で破綻して、
結局gsubに戻ってくる

正規表現をワードタイプの通知も含めて複雑にするか([[〜]]と<<〜>>は違う、みたいな)、
ワードタイプごとにgsubを分けて何度もgsubするかは好みと処理時間で

269 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 18:21:40 ]
あ、一時保持変数で思い出した

[[hoge-13]] だとHogeの13なんだけど、[[-13]] だと、その [[-13]] が言及してる文章のセクションの13項目なんだよね
ファイル名とかで区別できるんじゃなくて、文章の中の、HTML でいうとこの

<h1 class="about_hoge">Hoge について</h1>

リンクだよ→ [[-11]]

<h1 class="about_mage">Mage について</h1>

リンクだよ→ [[-12]]

で、[[-11]] は [[hoge-11]] で、[[-12]] は [[mage-12]] なんだよ
gsubと相性悪いなあと思う



270 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 18:48:56 ]
>>269
そんな表現認めたほうが悪いというのはさておきw
そこまでコンテキスト依存度高くしたら、スキャナで頭から舐めるか
構文木みたいな内部表現にしてから処理と出力するしかないんじゃ?

271 名前:デフォルトの名無しさん mailto:sage [2008/11/28(金) 19:23:45 ]
strscanでスキャナ書いてしまうのが楽。

272 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 14:03:45 ]
break と next と continue と return の使い分けがわかりません。

273 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 14:07:56 ]
>>272
break:ループ全体を打ち切り
next:ループ1回分だけ打ち切り
continue:なにそれ?
return:関数を打ち切り


274 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 14:08:27 ]
continue じゃなくて retry でした

275 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 14:12:23 ]
retryはループを振り出しに戻して最初からやり直す

276 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 14:15:21 ]
たいていの解説には嬉々として例が載ってるはずなんだけどな

277 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 14:27:11 ]
def foo(&x)
 @x = x
end
def bar()
 @x.call
end

foo{
 if $hoge
  xxxx 1
 else
  xxxx 2
 end
}

xxxxに何を入れたらいいかわかりません

278 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 14:33:17 ]
>>275
retryってループそのもののやり直しだったのか
ループのその回をやり直しっていうキーワードはないの?

279 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 14:35:04 ]
つーかここ初心者スレじゃないじゃん。

>>277
たぶんbreak。だめならreturn。irbで叩いてみ。

>>278
リファレンス嫁。



280 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 15:14:54 ]
retryはhttp扱ってるときに503を返しやがったときに使うわ。
rescue節でちょとsleepしてからretry

281 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 15:25:52 ]
>>278
redo
微妙なネーミングだなあ

282 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 16:17:10 ]
>>277
exit

283 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 17:22:56 ]
>>277
別に何も入れなくていいんじゃね
直接値だけを書いておけば

あえて書くなら next
なんか、ものすごく直感に反するが


284 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 23:37:49 ]
クロージャを抜けるのがnextっつーのがなんとも

285 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 01:27:57 ]
クロージャの次の処理へ進む、という意味に捕らえれば良い
元々は次の繰り返しへ進む、だけど

286 名前:デフォルトの名無しさん mailto:sage [2008/12/01(月) 12:42:24 ]
余計な苦労じゃ

287 名前:デフォルトの名無しさん [2008/12/02(火) 08:39:58 ]
Ruby 1.9.1 Preview 2 アゲ


288 名前:デフォルトの名無しさん mailto:sage [2008/12/02(火) 08:51:12 ]
>>277
ruby 1.7 以降なら、breakに返り値をつけられる

289 名前:デフォルトの名無しさん mailto:sage [2008/12/03(水) 18:23:06 ]
rubyをrudyと間違えるのはデフォだよな



290 名前:デフォルトの名無しさん mailto:sage [2008/12/03(水) 18:30:19 ]
RUbyとはしょっちゅう書く
IME2000の設定がね

291 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 06:57:24 ]
RPGツクールのRGSSって
ruby使えるやつならわざわざツクールなんかに頼るとは到底思えない

292 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 07:14:51 ]
どうして使ってもいないものを批判するの?

293 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 11:14:56 ]
[
  ["String", int foo, int bar],
  ["String", int foo, int bar],
  ["String", int foo, int bar],
...
]
というオブジェクトがあって、bar をキーにソートして
printf "%d, %s, %d", bar, str, foo,
という風に出力したいんですが、何かいい方法はありますか?

DBを使うかデータ構造を考え直したほうがいいんでしょうか?

294 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 11:15:31 ]
ruby勉強しようと思ったけどもうちょっと普及してからでいいな

295 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 11:21:27 ]
sort_byを使う

$data =
[
["foo", 1, 2],
["bar", 2, 1],
["bozh", 5, 0],
]
$data.sort_by{ |x| x[2] }.each{|x| printf "%d %s %d", x[2], x[0], x[1]}

296 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 13:03:50 ]
>>292
まあ、RGSS使った人間の台詞ではないな

297 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 13:06:26 ]
>>295
ありがとうございます。
というか、初心者スレがあったんですね。
失礼しました。


298 名前:デフォルトの名無しさん [2008/12/05(金) 14:27:23 ]
いつも思うだけど最近の言語っていわゆるjmp命令ってないよね。
昔9801でマシン語で組んでた時の癖があるからループ制御中にもう1つブレイク判定用チェツク入れてしかも入れ子分考慮してブレイク数考えるとか、
書き物がみづらくなるは、めんどくさいはでいつも思いながら使ってる。


299 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 14:31:43 ]
つ 例外
つ catch throw



300 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 14:34:00 ]
まあ、例外だな

301 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 14:43:56 ]
jmp considered harmful

302 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 14:51:23 ]
つ callcc

303 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 15:04:29 ]
マシン語世代は例外とかの高級言語概念が理解できないことがあるのでマジ困る

304 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 15:06:29 ]
本物のマシン語世代なら、ああ、割り込みのようなものね、と
サクッと理解できるはずだと思うんだが。

305 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 15:10:26 ]
例外と割り込みは全然違うだろ

306 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 15:14:04 ]
>>304
その理解だと割り込みとして使いやがるぞ

307 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 15:21:36 ]
>>306
いやそれは無理だろ
別物過ぎて話にならん

308 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 15:40:28 ]
解説とサンプルと実行結果を見て理解できないならプログラミングは向いてないよ。
〜みたいなものという不正確な比喩で何かを理解した気分に浸れたところで何がどうなるわけでもない。

309 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 15:52:38 ]
関数のようなもの



310 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 15:55:31 ]
パールのようなもの

311 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 16:00:29 ]
バイブのようなもの

312 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 22:15:26 ]
>>298
jump命令が使いたくなるようなコードを出してみよう。
そうすれば貴殿の主張も説得力を持つようになる。

313 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 22:47:35 ]
RubyForgeのログインクッキーがすぐなくなるような気がする
めんどくさいからログインやめようかなという

314 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 21:38:55 ]
Ruby 1.8系のMatrixの不具合?
>ruby18 -rmatrix -ve "p Matrix[[1,3,4],[3,1,2],[4,2,3]].det"
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mingw32]
24

>ruby19 -rmatrix -ve "p Matrix[[1,3,4],[3,1,2],[4,2,3]].det"
ruby 1.9.1 (2008-12-01 revision 20438) [i386-mingw32]
(matrix.rbでブロック引数が外部のローカル変数を遮蔽してる警告多数 省略)
(4/1)

ruby19の方があってる
どう書く?org の「行列式の計算」を解いていて発見

Matrix#determinant の定義をみると 1.9では割り算が / から .quo になってるので
1.8ではIntegerの割り算で端数が切り捨てられてる
FloatのMatrixだと大丈夫
>ruby18 -rmatrix -ve "p Matrix[[1.0,3.0,4.0],[3.0,1.0,2.0],[4.0,2.0,3.0]].det"
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mingw32]
4.0


315 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 01:24:20 ]
そういうガチっぽいのはredmineに登録してください・・・

316 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 01:56:20 ]
パッチとテストを書いてください

317 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 23:22:58 ]
Windows の Mingw版ruby 1.9.1-preview2ですが
>cat てすと.rb
p [$0,$0.encoding]
p [__FILE__,__FILE__.encoding]
p $0 == __FILE__

>ruby19 -v てすと.rb
ruby 1.9.1 (2008-12-01 revision 20438) [i386-mingw32]
["てすと.rb", #<Encoding:Windows-31J>]
["\x82\xC4\x82\xB7\x82\xC6.rb", #<Encoding:US-ASCII>]
false

-Ksつけるとか、ファイル冒頭のマジックコメントで
Windows-31J を指定すると大丈夫なんですが
ファイルの中身のEncodingと
ファイル名のEncodingは無関係のような気もするし
どうしたもんでしょうね

Windowsだと ARGVや$0はWindows-31Jなので
__FILE__も同じでいいような


318 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 23:26:10 ]
め、めんどくせえ…

319 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 15:53:44 ]
>>317
>Windowsだと ARGVや$0はWindows-31Jなので
>__FILE__も同じでいいような

ぜんぜんよくないだろう。。。
しかしどうしたもんでしょうね



320 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 16:19:04 ]
>>319
横からすまん。よくないってどういうこと?
$0と__FILE__のエンコーディングを揃えるのはごく自然に思えるんだが。

321 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 18:01:07 ]
>>320
$0と__FILE__のエンコーディングは揃うべきだと思うが、ARGVは違うでしょ。

ARGVはコンソールで指定されるからWindows-31Jになるので、これはOK。
$0と__FILE__のエンコーディングはファイルシステムのエンコーディングになるのが一番自然だろうと思う。
だからってUTF-16で渡されても嬉しくないけどね。

322 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 20:59:22 ]
| > ruby -v
| ruby 1.9.1 (2008-12-01 revision 20438) [i386-mingw32]
|
| > ruby -r Win32API -e 'Win32API.new("msvcrt.dll", "_wmkdir", "p", "i").call("あいうえおかきくけこ".encode("utf-16le"))' & dir /b
| あいうえおかきくけこ(ゴミ文字が続く)
|
| > ruby -r Win32API -e 'Win32API.new("msvcrt.dll", "_wmkdir", "p", "i").call("あいうえおかきくけこ".encode("utf-16le").force_encoding("binary") + "\0")' & dir /b
| あいうえおかきくけこ
| あいうえおかきくけこ(ゴミ文字が続く)
文字列の終端記号がUTF-16/32などでも常に1バイトしか付加されません
UTF-16ならば2バイト、UTF-32ならば4バイトの終端記号が付加されるのを期待します

323 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 21:03:45 ]
WindowsのネイティブでRubyをまともに使えるようにしようという努力は、どれくらい実のあることなんだろうか

324 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 21:59:53 ]
世の中のクライアントPCのほとんどがWindowsであることを考えると、非常に重要で意味のあること。
問題はmatzにその気がまったく無いことだよな。Ruby捨てるのが早かったりして。

325 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 22:02:12 ]
>>322
redmine.ruby-lang.org/
つ ruby-dev ML

326 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 23:50:03 ]
1.8.6 では ruby -e 'p p 1' とかやると、
warning: parenthesize argument(s) for future version
と言われたけど、1.8.7 では warning が出なくなってる。
括弧なしも正式にOKになったってことなのかな。

327 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 10:27:54 ]
>>322
ruby19 -rwin32api -e "Win32API.new('user32.dll','MessageBoxW','ippi','i').call(0,('あいうえおかきくけこ').encode('utf-16le'),'メッセージボックス'.encode('utf-16le'),0)"
でMessageBoxを表示させると確かに後ろにごみがつきますね
ワイドキャラクタって文字サイズ分の終端記号が必要なのか

Win32APIやdlでは文字列の引数を pack('p')でポインタに変換してるようなので
UTF16やUTF32をpack('p')するときは終端記号が文字幅分付加されればいいのですかね

とりあえず、自前で終端記号をつけておけば動きますけど
ruby19 -rwin32api -e "Win32API.new('user32.dll','MessageBoxW','ippi','i').call(0,('あいうえおかきくけこ').encode('utf-16le')<<0,'メッセージボックス'.encode('utf-16le')<<0,0)"


328 名前:デフォルトの名無しさん [2008/12/13(土) 20:19:53 ]
金光ですっ。どもっ。

329 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 16:24:29 ]
>>327
> Win32APIやdlでは文字列の引数を pack('p')でポインタに変換してるようなので
> UTF16やUTF32をpack('p')するときは終端記号が文字幅分付加されればいいのですかね

packで終端記号を付けているわけではない。
というかそもそも、常にNUL終端されていることが保証されているわけではない。
保証されているのは、StringValueCStr()を呼んだ場合に終端されることだけ。
ワイドキャラクタ以外でNUL終端されているように見えるのは、歴史的経緯と実装上の都合による偶然。

でもdlとかWin32APIって入力文字列か出力バッファかなんて気にしてないんだよなぁ。




330 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 22:36:03 ]
勝手な想像では
Stringは内部ではNULL終端されたCのバイト列で文字列を保持していて
その直後には文字列の拡張に備えたある程度のバッファの残りがあり
実際の文字列長や、バッファ全体の大きさ等がセットになった構造だろうと思ってました

Cのバイト列として直接扱えるようにNULL終端されてないと
ちょっとしたミスでバッファオーバーフローしやすいのでまずいだろう
それゆえに、pack('p')では特に終端の処理はしてないのではないかとも思ってました

なので、pack('p')されたら、とりあえず引数で渡されたString内部の
文字列直後のバッファを\x0\x0\x0\x0で埋めとけばいいと思うのです
もしバッファがぎりぎりで余裕が無くても、バッファを拡張してでも埋めればいい

バッファとして使うのなら、いちいち4byteものNULL終端するのは無駄かもしれませんが
文字列としてか単なるバッファとして使われるのか区別がつけられないので
安全側に振っておけと


331 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 22:41:59 ]
Rubyで書くなら
引数のstring.concat(0).chop!
NULLを連結しておいて、それを切り詰めると
文字列直後のバッファには文字幅分のNULL終端が
残ってるだろう
たまたま現在の実装ではそうなるだけかもしれませんが

Ruby本体が内部でやるとするなら文字のエンコーディングと関係無しに
4byteNULL終端することにすれば少しは速度の低下を抑えられるのではないかと
そのように、NULL終端していることをRubyが保証するようにしてほしい

ま、pack('p')なんてdlでしか使われないだろうし
dlを使ってる時点でパフォーマンスなんて気にしても仕方ないので
それくらいやっちゃってもいいんじゃないかと







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<99KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef