トップページ⇒tech
995コメント369KB

Ruby 初心者スレッド Part 55

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2014/06/21(土) 23:39:44.94ID:rKd1VvW8
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
RoRはスレ違いよ

前スレ
Ruby 初心者スレッド Part 54
http://peace.2ch.net/test/read.cgi/tech/1392598207/

るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/

Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/

逆引きRuby
http://www.namaraii.com/rubytips/
0655デフォルトの名無しさん2014/10/16(木) 15:56:08.66ID:CsOFEKWu
命名規則が破綻したケースの例としては、ハッシュを更新する破壊的メソッド Hash#update に
後から非破壊メソッドを追加できずしかたなく Hash#merge! と Hash#metge を追加した、
というのがあるね

648 デフォルトの名無しさん [sage] 2014/10/14(火) 07:50:28.20 ID:FY2dMxGy Be:
pushやpopはどう考えても機能名称的にpushやpopという単語だろうという縛りがないでもない
まあ今も昔も深く考えてないというのは間違いないと思うが
今だって標識くらいの見かけ的な役割だもんね ! と ?
0656デフォルトの名無しさん2014/10/16(木) 17:18:05.50ID:MV7SzJpM
破壊的メソッドは戒めを込めて delete!!!!!!!!!!! にしておくべきだった
0657デフォルトの名無しさん2014/10/17(金) 02:16:25.49ID:EUFGtU/Q
Windows7上でruby2.0.0 p451のgemを使ってnokogiriをインストールしようとしましたが
うまくいきません。ネットでやると失敗します。

で、「Rubyによるクローラ開発」って本に、そういうときはコンパイル済みバイナリをローカルに
置くのがいい、とあったので、rubygem.orgからx86-mingw32というのを取って来て実行してみた
のですが、
Unable to resolve dependencies: nokogiri requires mini_portile
ってエラーが出て進まなくなってしまいます。
環境が悪いんでしょうか? みなさんとこ上手くインストールできてます?
0658デフォルトの名無しさん2014/10/17(金) 04:56:18.47ID:lMkb3UyL
nokogiri requires mini_portile
0659デフォルトの名無しさん2014/10/17(金) 07:48:33.50ID:tubR575L
そのエラーメッセージを和訳するんだ
0660デフォルトの名無しさん2014/10/17(金) 07:49:03.51ID:XvOfVc4r
>>656
トニー・ジャーか…?
マッハ!のタイトルっぽいな
0661デフォルトの名無しさん2014/10/17(金) 08:10:47.98ID:QP1DIUi6
>>657
環境が悪いとすれば君の生まれ育った環境が悪いんだろう
0662デフォルトの名無しさん2014/10/17(金) 08:21:15.00ID:4+0nBHRN
絶滅しそうなプログラミング言語は?
http://developers.slashdot.jp/story/14/10/10/2155216/

環境が悪いせいかやっぱ滅び行く言語みたいだな
0663デフォルトの名無しさん2014/10/17(金) 11:49:30.34ID:Q41qEvOL
嬉しそうですね
0664デフォルトの名無しさん2014/10/17(金) 11:53:45.91ID:HZvg3la9
まあな
0665デフォルトの名無しさん2014/10/17(金) 15:50:56.69ID:TIsdM5eD
Android上でスクリプトを動かしたいのですが、どんな選択肢がありますでしょうか。
Android上でコードを書き換えて動作させたりしたいと思っているので、Rubotoはちょっと方向性が違うと思っています。
よろしくお願いします。
0666デフォルトの名無しさん2014/10/17(金) 19:32:37.25ID:HZvg3la9
SL4A
0667デフォルトの名無しさん2014/10/17(金) 21:07:26.92ID:j5u0ESS9
>>665
>Android上でコードを書き換えて動作させたりしたいと思っているので、Rubotoはちょっと方向性が違うと思っています。

意味不明だな
Ruboto IRB(無償 Android アプリ)を使えば、「コードを書き換えて動作させたり」できるよ
メソッドやクラスの定義はもちろん、Ruboto IRB 上で GUI を生成して動かせる

・Ruboto IRB : 過去最大の衝撃。これは凄い!!AndroidでRubyが動く!!Androidアプリ427 | オクトバ
 http://octoba.net/archives/20100305-ruboto-irb-android-427.html

Roboto IRB で対話的に Android API を色々と触りつつ、本格的なアプリは PC 上の
Ruboto または RubyMotion(現状はベータ版)でクロス開発するというプロセスになると思われる
0668デフォルトの名無しさん2014/10/17(金) 23:42:47.60ID:4+0nBHRN
だせえ
すぐ潰れそう
0669デフォルトの名無しさん2014/10/18(土) 08:36:09.60ID:cvL+Wsv6
>> 666
ありがとう、試してみます。

>> 667
PCでRubyをコンパイルしてAndroidで動かす仕組みだと勘違いしていました。
ご指摘いただきありがとうございます。
0670デフォルトの名無しさん2014/10/19(日) 20:19:35.03ID:vOhlo+XI
OCRAで32bitバイナリと64bitバイナリを生成したいのですが
何か良い方法はないでしょうか?
何もオプションを付けないと64bitバイナリが生成されるようですが・・・
2.0.0p481[x64-mingw32]
0671デフォルトの名無しさん2014/10/20(月) 01:41:16.45ID:6j05cluu
ocraで作ったバイナリってウイルス検出されちゃうことがあるなんて話があったけど、
大丈夫なのかな? 個人環境で起きるなら良いんだけど、会社だとセキュリティ担当に
自動で通報されちゃうので説明したりとちょっと大事になるので面倒くさい。
0672デフォルトの名無しさん2014/10/20(月) 06:54:15.02ID:v2I1VvBQ
ocraってRuby2.1以降とか動かんでしょ
0673デフォルトの名無しさん2014/10/20(月) 19:46:50.69ID:kEWHmjOP
お蔵入り
0674デフォルトの名無しさん2014/10/24(金) 23:57:31.15ID:pwlehayb
数学的な意味で整数かどうか判定する方法教えてください
1.0.integer?
だとfalseが返ってきてしまいます
0675デフォルトの名無しさん2014/10/25(土) 00:09:39.99ID:L2ksR7r0
a = 1.0
a.floor == a # => true

a = 1.1
a.floor == a # => false

こういうこと?
0676デフォルトの名無しさん2014/10/25(土) 08:32:50.27ID:j6rbe9Rw
質問者が「数学的に」と言ってきてるのだから
複素数にも対応してあげるのが親切ってもんだろう。
そこはfloorでもceilでもなくto_iだな。
0677デフォルトの名無しさん2014/10/25(土) 08:34:28.50ID:8yzcXx0W
>>675
誤差考えるとなあ

irb(main):006:0> a=Math.sqrt(27)/Math.sqrt(3)
=> 3.0000000000000004
irb(main):007:0> a.floor==a
=> false
0678デフォルトの名無しさん2014/10/25(土) 08:37:31.51ID:Osfk0YxR
ん?aは整数じゃないから正しいんでは?
0679デフォルトの名無しさん2014/10/25(土) 09:19:46.12ID:NijgTWso
計算を全部Rationalでやったうえでdenominatorが1だったら整数
もしくは
require'mathn'
とかかなあ
0680デフォルトの名無しさん2014/10/25(土) 12:30:31.13ID:9i0hi/co
>>678
√27 ÷ √3
= 3√3 ÷ √3
= 3
を a に代入
以下略
0681デフォルトの名無しさん2014/10/25(土) 12:36:41.68ID:cqm+9BdH
irb(main):006:0> a=3*Math.sqrt(3)/Math.sqrt(3)
=> 3.0000000000000004

わろた
0682デフォルトの名無しさん2014/10/25(土) 13:23:01.23ID:Osfk0YxR
>>680
それが3になってないからfalseで正しいじゃん
0683デフォルトの名無しさん2014/10/25(土) 13:39:00.78ID:NijgTWso
無理数が入る計算はどうあがいても誤差が出るだろうなあ
累乗根とかの無理数をその場で計算せずそのままあつかうようなクラスを個別に定義していけば
そのうち全部誤差なしにできるかもね(もちろん最終的に有理数になる場合)

>>682
人間が計算すれば3になるからtrueを得たいってことでしょ
0684デフォルトの名無しさん2014/10/25(土) 14:21:19.99ID:L2ksR7r0
>>677
無理数が入るものを有限桁しか持てない計算機で計算させるんだから、
その誤差を考えて計算させないと意味が無い
これはRubyに限った話じゃなく、計算機に計算をさせる上で必ず考慮しなければ
ならないポイント
0685デフォルトの名無しさん2014/10/25(土) 14:47:58.38ID:B/NlI7do
>>681
$ python
>>> from math import sqrt
>>> 3 * sqrt(3) / sqrt(3)
3.0000000000000004

Prelude> 3 * sqrt 3 / sqrt 3
3.0000000000000004

julia> 3*sqrt(3)/sqrt(3)
3.0000000000000004

そういうものだよ
カッコでくくるといいかもね
0686デフォルトの名無しさん2014/10/25(土) 15:03:54.32ID:L2ksR7r0
EPS = 1e-10
(a.round - a).abs < EPS

みたいにやるのがよくある方法だね
(ただしaがそれほど大きくないという条件はつくけど)
0687デフォルトの名無しさん2014/10/25(土) 16:10:16.86ID:OBw5xvhC
それだと整数にならないケースも整数だと誤検出する可能性を排除できない
0688デフォルトの名無しさん2014/10/25(土) 16:55:42.43ID:5nT/ZQiN
>>676
Complex#to_iは虚数部が0じゃない時はRangeError吐くから
もう少し工夫しないといけない気がする
0689デフォルトの名無しさん2014/10/25(土) 17:42:04.77ID:Osfk0YxR
>>683
>>674は計算の仕方を聞いてるわけじゃないだろ
0690デフォルトの名無しさん2014/10/25(土) 19:46:48.42ID:L2ksR7r0
>>687
有限桁の計算機で計算する以上、無理数が混じった計算で整数かどうかを正確に
判定することなんてできないよ
0691デフォルトの名無しさん2014/10/25(土) 19:50:06.84ID:/9oTGPcj
バカにはムリw
0692デフォルトの名無しさん2014/10/25(土) 19:51:20.02ID:TvGWFX6/
無理数使いたいなら記号計算しかないな
そういうアカデミックな世界はPythonの方が環境整ってるからおすすめ
0693デフォルトの名無しさん2014/10/25(土) 20:55:31.74ID:OBw5xvhC
sympyいいね
0694デフォルトの名無しさん2014/10/25(土) 21:43:14.43ID:AJUIP7QM
浮動小数点は対数曲線上に、
まるで点のように飛び飛びに存在しており、
数学の実数のようには、数が連続していない

また数が大きくなるほど、2点間の距離も大きくなっていき、
最後には2点間の距離は、1よりも大きくなり、1を足せなくなる
また2点間にある値は、どちらかに丸められて表現される

>>686
絶対誤差と相対誤差という概念もある
1,000で1の誤差と、1.0で0.001の誤差は、
1/1,000という同じ誤差
0695デフォルトの名無しさん2014/10/26(日) 20:04:28.62ID:z1XaoFmt
coreserverにredmineを入れてfcgiで動くようにしたつもりだけど500 errorでて動かなくてrubyわからなくて涙目
どうやってデバッグしたらいいの?
0696デフォルトの名無しさん2014/10/26(日) 21:06:23.46ID:e33XAUxV
>>695
web server のログを見てみよう
0697デフォルトの名無しさん2014/10/26(日) 21:24:15.67ID:z1XaoFmt
サーバーのログは500だけ。
redmine/log/production.logはアクセスしても更新されてないです。
なぜだ。
0698デフォルトの名無しさん2014/10/26(日) 21:25:42.86ID:e33XAUxV
>>697
web server のエラーログだよ
0699デフォルトの名無しさん2014/10/26(日) 21:57:12.33ID:z1XaoFmt
coreserverは/var/logのパーミッションが
drwx--x--x 6 root root
で一般ユーザーには見れません。

ほかのところで見れるのかな
0700デフォルトの名無しさん2014/10/26(日) 21:57:13.28ID:BCpeePeb
>>695
coreserverってレンタルサーバか。CGIしか動かないんじゃないの。rackとかいじれば動くかもしれないけど、planioとか設置済みの借りたほうがいいんじゃないの。
0701デフォルトの名無しさん2014/10/26(日) 22:08:53.22ID:z1XaoFmt
>>700
sshでログインして色々できるので
~/usr/以下に
ruby-2.1.3
subversion-1.8.10
fcgi-2.4.1
make-4.0
libtool-2.4.2
など、依存関係、バージョンアップが必要なやつらを入れてやって
ようやくエラーなくbuild installできたり
require 'fcgi'でのーさっちふぁいる言われなくなったところです。
0702デフォルトの名無しさん2014/10/26(日) 22:09:41.87ID:z1XaoFmt
まちがえた
bundle installやった。
0703デフォルトの名無しさん2014/10/27(月) 01:56:33.97ID:AAN1U1FS
heroku使えばいいのに。
0704デフォルトの名無しさん2014/11/01(土) 10:53:07.72ID:KbCSRqlI
ある1万桁程度のBignum同士の乗算が
実際の値とは異なるものになってしまうのですが、何故なのでしょうか?
ruby-2.1.3 とruby-2.1.4 で動作を確認しました。
OSはvistaです。
0705デフォルトの名無しさん2014/11/01(土) 11:00:20.69ID:3nVvYlYV
動かしたコードを貼りなよ
codepadとかに
0706デフォルトの名無しさん2014/11/01(土) 11:48:23.78ID:KbCSRqlI
お返事ありがとうございます。
具体的には、高速で階乗を求めるソースを考えている時に起こりました。
http://codepad.org/uMrdmWoQ
上のソース(numの階乗を出力)で、5688以上の階乗を求めようとすると誤った値が出力されます。

原因を調べたところ、いつくかの乗算の結果がおかしなことになっていました。
その例です↓
http://codepad.org/Evm4WIzw

なお、codepad上では正しく動いています。
0707デフォルトの名無しさん2014/11/01(土) 11:59:15.57ID:KbCSRqlI
追記です。
1.8.7
1.9.3
2.0.0
では正常に動くことを確認しました。
0708デフォルトの名無しさん2014/11/01(土) 12:42:09.57ID:JDs1edib
>>707
2.1 のバグだね、きっと
↓にしたがってバグ報告しましょう

https://bugs.ruby-lang.org/projects/ruby/wiki/HowToReportJa
0709デフォルトの名無しさん2014/11/01(土) 13:08:03.38ID:E0YeAKNc
こんな基本的なところでデグレードとか、ほんとRubyは信用ならないな。
やはり科学技術計算ならPythonか。
0710デフォルトの名無しさん2014/11/01(土) 13:12:37.62ID:JDs1edib
>>709
そう思ってるならRubyスレなんか覗かなきゃいいのに
単純に叩くネタを探しにきてるだけなのかい?
0711デフォルトの名無しさん2014/11/01(土) 13:13:46.50ID:tAp5B7hH
だって計算機科学とか全く無知な人でもrubyをある程度触ってればコミッタになれちゃんだもの
0712デフォルトの名無しさん2014/11/01(土) 13:18:44.69ID:NzxKzmT+
Webアプリどっぷりな人って基礎技術舐めてる子が多いからな
0713デフォルトの名無しさん2014/11/01(土) 14:18:25.31ID:KbCSRqlI
>>708
どうもありがとうございました!!
0714デフォルトの名無しさん2014/11/01(土) 16:57:13.22ID:Bg+qUaZT
error_logを別ファイルに吐かせる方法ってありますか?
0715デフォルトの名無しさん2014/11/01(土) 18:33:01.35ID:dJZLIuNK
trunk では直ったようだね
0716デフォルトの名無しさん2014/11/01(土) 20:35:05.70ID:dJZLIuNK
>>709
Bignum は 2.1 で結構変わった部分だから、単純なデグレードではないね
むしろ、新機能と言ってもいい部分

なので、今回のようなバグ報告はありがたいだろうね
0717デフォルトの名無しさん2014/11/02(日) 05:24:22.27ID:Vf5VSDSD
Pythonは、Rubyを目の敵にしている
Rubyさえ消えれば、Pythonの1強だから

鬼畜米英に対して、今こそ、日本人として立たねばならぬ!
全国民は何があろうと、Rubyを死守せよ!
0718デフォルトの名無しさん2014/11/02(日) 06:47:27.44ID:LNjYg/LZ
>>717
Out of guntyuu.
0719デフォルトの名無しさん2014/11/02(日) 06:56:13.27ID:ihJb2jjw
>>717
環境の問題でRuby使ってるけど、
正直、使えるならPython使いたいわ
0720デフォルトの名無しさん2014/11/02(日) 10:39:25.45ID:f5IAMfRc
>>717
使いたくない
>>719
俺も
0721デフォルトの名無しさん2014/11/02(日) 10:55:35.21ID:6vShOxas
PythonにゃロクなWebのFWがないからねぇ
Rails(か最悪はPHP)を使わざるを得ないことも多いんだね
0722デフォルトの名無しさん2014/11/02(日) 10:59:49.55ID:f5IAMfRc
>>721
結局そういう事だよねー
0723デフォルトの名無しさん2014/11/02(日) 11:01:48.93ID:LNjYg/LZ
>>721
逆にdjangoがあるからpythonを選ぶくらい。
0724デフォルトの名無しさん2014/11/02(日) 11:03:11.62ID:6vShOxas
>>723
Pythonがいい言語なのは同意できるが、Djangoは同意できないw
0725デフォルトの名無しさん2014/11/02(日) 11:04:07.50ID:ihJb2jjw
Pythonって書いてて余計なことに気を使わなくても
それなりに簡潔で読みやすいコードになるんだよな
RubyはWordで体裁気にしながら文章書いてるような気持ちの悪さを感じる
0726デフォルトの名無しさん2014/11/02(日) 11:09:10.69ID:6vShOxas
>>725
その部分ではPythonもRubyも大差ないなー
Rubyで簡潔で読みやすいコードにならないというなら、単純にRubyを知らないだけちゃうんかって感じ

だが、Perlよ、お前だけはだめだw
0727デフォルトの名無しさん2014/11/02(日) 11:14:46.34ID:ihJb2jjw
>>726
RubyはPython以上に簡潔で読みやすいコードを書けるけど、
使い方によってはPerlにもなるでしょ
良し悪しの問題ではないけどPythonと一番思想が違うところ
0728デフォルトの名無しさん2014/11/02(日) 11:18:16.14ID:6vShOxas
>>727
まさか単純にインデントベースのブロックのこと言ってるんじゃあるまいな?
だとすれば完全に好き嫌いの話でしかないぞ

そのレベルだと君が簡潔で読みやすいコードを書けるのはPythonとCoffeeScriptぐらいってことになる
0729デフォルトの名無しさん2014/11/02(日) 11:18:23.22ID:LNjYg/LZ
>>724
そう? 言語としてはrubyのが好き。
djangoは標準でユーザー管理ついてるのと、かなりDRYなとこがいい。
0730デフォルトの名無しさん2014/11/02(日) 11:24:44.64ID:4UwsIu6G
>>726
ぱ、Perlも読み易く書けば読み易く書けるし!
0731デフォルトの名無しさん2014/11/02(日) 11:25:18.61ID:ihJb2jjw
>>728
ブロックに限らず、単にRubyの方が書き方にバリエーションが多いって言ってるだけだよ
両方使ってるならそれくらいは納得してくれるだろ?
俺はバリエーションが少ないほうが好みだ、それだけ
0732デフォルトの名無しさん2014/11/02(日) 11:41:20.62ID:Ot4JK/1Q
教えてください
数字をEXCELの列の文字に変換するにはどうすればいいですか。

入力(数値) 0,1,2,3,…
出力(文字) A,B,C,…Z,AA,…,AZ,BA…,ZZ,AAA…
0733デフォルトの名無しさん2014/11/02(日) 12:01:36.32ID:OPPSZIQK
n="A"
$_.times{n.succ!}
0734デフォルトの名無しさん2014/11/02(日) 12:23:24.95ID:CjBmvnJw
CoffeeScript はむしろ Python より Ruby に似てる
0735デフォルトの名無しさん2014/11/02(日) 12:29:25.47ID:CjBmvnJw
>>732
Base26 encoding
0736デフォルトの名無しさん2014/11/02(日) 14:37:28.26ID:3t1Cscrq
それをRubyのせいにしてしまうのがだめだな
人には向き不向きがあるからそれならやめておけばいい
0737デフォルトの名無しさん2014/11/02(日) 14:44:31.57ID:6vShOxas
>>732
n.to_s(26).tr('0-9a-p', 'a-z').upcase
0738デフォルトの名無しさん2014/11/02(日) 15:17:25.24ID:3t1Cscrq
>>732
遅いしメモリ食うし最大値を考慮する必要があるけど単純
[*"A".."ZZZ"][n]
0739デフォルトの名無しさん2014/11/02(日) 16:19:28.15ID:/OQ7HjUb
>>732
もっときれいにかけるのかな。
ついでに英字から数字を出力するのも作ってみた。

def column_code n
len = Math.log(25*n/26.0+1, 26).floor+1
p = n+1+2*26**len - ("1"*(len+1)).to_i(26)
p = p.to_s(26).tr('0-9a-p', 'A-Z')[1..-1]
return p
end

def column_decode s
len = s.length
p = ( ("B"+s).tr('A-Z', '0-9a-p') ).to_i(26)
q = ( "1"*(len+1) ).to_i(26)
return p+q-1-2*26**len
end
0740デフォルトの名無しさん2014/11/02(日) 17:13:03.61ID:bNYsKDd8
無駄な計算が多かったので訂正

def column_code n
len = Math.log(25*n/26+1, 26).floor+1
return (n+(24*26**len+26)/25).to_s(26).tr('0-9a-p', 'A-Z')[1..-1]
end

def column_decode s
len = s.length
return s.tr('A-Z', '0-9a-p').to_i(26)+(26**len-26)/25
end
0741デフォルトの名無しさん2014/11/02(日) 18:21:25.77ID:LNjYg/LZ
再帰で考えたが、>>733を見て挫けた。
0742デフォルトの名無しさん2014/11/02(日) 19:13:57.03ID:B2VB/G2X
succを使うのが一番すっきりしてるしどうせ
5〜6桁目など存在しないのだからパフォーマンスも気にしなくてよいと思う。
0743デフォルトの名無しさん2014/11/03(月) 08:06:02.67ID:UI06u95t
class Point3D < Struct.new("Point3D", :x, :y, :z)
ストラクトクラスをスーパークラスにするやり方が本に
上のように書いてあったのですけど
Point3DクラスがPoint3Dクラスを継承することになってもいいのでしょうか?
0744デフォルトの名無しさん2014/11/03(月) 10:54:32.79ID:1DGR/mlS
作者に聞けよ
0745デフォルトの名無しさん2014/11/03(月) 11:48:48.65ID:lYTbCh7P
>>744
お騒がせして申し訳ありませんでした。
自分で考えることとします。
0746デフォルトの名無しさん2014/11/03(月) 12:21:28.78ID:VhC2rtBo
>>743
Struct.new("Point3D", :x, :y, :z) は Struct::Point3D になるから問題無い。
0747デフォルトの名無しさん2014/11/03(月) 12:24:39.05ID:aZ1lF/ar
>>743
実際に試してみればいい

irb(main):001:0> class Point3D < Struct.new("Point3D", :x, :y, :z); end
=> nil
irb(main):002:0> Point3D.superclass
=> Struct::Point3D

Struct.new( .... ) というスタイルを使うと、クラスは名前空間 Struct の下で定義される
Point3D と Struct::Point3D は別のオブジェクトだから、
それらの間に継承関係が存在しても何ら問題はない

もちろん、以下のようなケースはエラーになる

irb(main):001:0> class Struct::Point3D < Struct.new("Point3D", :x, :y, :z); end
TypeError: superclass mismatch for class Point3D
from (irb):1
from /opt/local/bin/irb:11:in `<main>'

irb(main):001:0> class Point3D < Struct.new("::Point3D", :x, :y, :z); end
NameError: identifier ::Point3D needs to be constant
from (irb):1:in `new'
from (irb):1
from /opt/local/bin/irb:11:in `<main>'
0748デフォルトの名無しさん2014/11/03(月) 13:41:16.97ID:Yqw0F9So
require 'timeout'
begin
 f = Fiber.new do
  timeout(1) do
   Fiber.yield
  end
 end
rescue
 p 1
end
begin
 f.resume
 sleep (2)
 f.resume
rescue
end

上記のコードで1が出力されるはずと期待していたら例外処理が補足されずに終了してしまいました。
sleep(2)でexecution expiredになるのは分かるんですが、何故補足されないんでしょうか?
Ruby2.0.0と2.1.4で試しましたが結果は同じでした。
0749デフォルトの名無しさん2014/11/03(月) 14:43:27.79ID:IiZVKpQi
ある多次元の配列arrayに対して、要素数が不定のの配列indexを用いて
array[index[0]][index[1]]〜[index[-1]]の要素を操作したいのですが
何かうまい方法は無いでしょうか?
0750デフォルトの名無しさん2014/11/03(月) 15:24:11.59ID:aZ1lF/ar
>>748
単純に timeout(1) へ与えたブロック内で Fiber.yield しているので
コンテクストが親に切り替わっているからだろ

自分でコンテクストを切り替えておいて、
それでもなお元のコンテクストでタイムアウト例外を補足できると期待するという
>>748 の思考回路がわからん
Ruby はエスパーではないから >>748 の意図を読み取って振る舞ってはくれないし、
コンテクストを切り替えろというコードの指示に従って忠実に動いているだけ

自分が何を意図してコードを書いているのか、よく考えたほうがいいと思う
0751デフォルトの名無しさん2014/11/03(月) 15:27:42.87ID:IO/fHbsZ
例外が上がるのはf.resumeの実行以降だからまずはp 1の位置が違う(下のrescueにすべき)と思うけど
なぜかTimeout::Errorじゃない無名のクラスになってて補足できてないね・・・なぜだろう誰か詳しい人

コンテクストが親に切り替わっても例外は上がるんだね
俺よくわかってないや

>>749
こんな感じ?
取得
index.inject(array){|s,r|s[r]}
設定
index[0..-2].inject(array){|s,r|s[r]}[index[-1]]=x
0752デフォルトの名無しさん2014/11/03(月) 15:41:58.79ID:aZ1lF/ar
>>749
0、1、とくれば次に期待するのは 2、3、と増加する振る舞いだと思うけど、
なぜか -1 になっている
すまんが、-1 になれる上手い方法は思いつけない

ちなみに 0、1、ときて最後に N へ到るという多次元配列であれば、

(0..N).inject(array) { |ary, n| ary[index[n]] }

でアクセスできると思う
0753デフォルトの名無しさん2014/11/03(月) 15:42:39.68ID:IiZVKpQi
>>751
ありがとうございます!!
indexを使うといいんですね。
0754デフォルトの名無しさん2014/11/03(月) 15:47:23.48ID:IiZVKpQi
>>752
説明が下手ですみません。
大変参考になりました。ありがとうございます。

あと>>753はindexじゃなくてinjectですね。
0755デフォルトの名無しさん2014/11/03(月) 15:47:46.99ID:3kX/Tanu
>>751
悪かないがindexが無効範囲だったときにnilが返るのが不親切じゃないか?
多少ダサくてもindexチェックのついた高階関数にバラすのが良いように思う。
■ このスレッドは過去ログ倉庫に格納されています