Ruby初心者スレッドPart7

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2006/09/24(日) 03:14:55
これだからRubyistは素晴しいコードを書くなんて言われるんだよな
953デフォルトの名無しさん:2006/09/24(日) 03:19:23
実際、他の言語より読むのはラクだ。
ソフトの内容の割に行数が少ないと感じる。
954デフォルトの名無しさん:2006/09/24(日) 03:19:47
ものすごくポジティブな切り返しだな。
955デフォルトの名無しさん:2006/09/24(日) 09:38:10
>>953
>実際、他の言語より読むのはラクだ。 
>ソフトの内容の割に行数が少ないと感じる。 

はたして、読みやすさと、ソフトの割りに行数が少ないことは共存するのだろうか?
956デフォルトの名無しさん:2006/09/24(日) 09:44:56
するでしょ
957デフォルトの名無しさん:2006/09/24(日) 09:54:10
ソフトってなんじゃらほいという話にはなるが、
Rubyスクリプトは高等な(w動作をさせられる場合でも
読み下しやすい短さで書けることが多いとは感じる
958デフォルトの名無しさん:2006/09/24(日) 10:02:48
pythonで定積分。
def integrate (f, a, b, n):
def subinte (f, a, b, n):
if a < b :
return f(a) + subinte (f, (a + n), b, n)
else:
return 0.0
return n * subinte(f, a, b, n)

integrate((lambda x: x*x), 0.0, 1.0, 0.01)

rubyで書くとどうなるの?
つうか、rubyで、関数を引数にするにはどうするの?
959デフォルトの名無しさん:2006/09/24(日) 10:06:12
いくら短くても inject 使われてたらあほな俺にはそれ以降読めん。
960デフォルトの名無しさん:2006/09/24(日) 10:27:37
>>958
pythonのコードでインデントが消えるのって致命的だなあ。

それはともかく、こんな感じかと。
コピペするなら全角スペースは適当に置換してね。

def integrate (a, b, n, &block)
 def subinte (a, b, n, &block)
  if a < b
   return block.call(a) + subinte((a + n), b, n, &block)
  else
   return 0.0
  end
 end
 return n * subinte(a, b, n, &block)
end

p integrate(0.0, 1.0, 0.01){|x| x*x}
961958:2006/09/24(日) 11:36:08
>>960 THX! すごく勉強になった
962デフォルトの名無しさん:2006/09/24(日) 11:43:57
p integrate(0.0, 1.0, 0.01){|x| x*x} の二番目の引数を増やしていくと
SEGVする件について。
963デフォルトの名無しさん:2006/09/24(日) 11:47:16
3.72まで大丈夫だった
964デフォルトの名無しさん:2006/09/24(日) 13:16:08
>>948
話がわかってないな。
965デフォルトの名無しさん:2006/09/24(日) 15:04:34
>935-936
あいや、再現条件が間違ってました。
cmd.exeのカレントディレクトリがc:\windows\system32だと、ワンライナーでこけてしまいます。
こちらの環境依存でしょうか?
c:\windows\system32>ruby -e"puts [22]"
#=> [BUG] cross-thread violation on rb_gc()
c:\windows\system32>ruby -e"puts 2/2"
#=> 1
c:\windows\system32>ruby -e"puts 2**2"
#=> [BUG] cross-thread violation on rb_gc()
966デフォルトの名無しさん:2006/09/24(日) 15:09:28
折れは1.38で落ちた。mswin32。(Pythonは9.0でもOKだった)
967デフォルトの名無しさん:2006/09/24(日) 15:19:16
>>932
Enumerable を include しておきながら collect は Array でオーバーライドしてるとすると、
それは Array#collect のドキュメントに明記しておかないとまずくね?
968デフォルトの名無しさん:2006/09/24(日) 15:34:16
話が見えない。
969デフォルトの名無しさん:2006/09/24(日) 15:48:23
つまりこういうことさ。
Rubyだってソフトウェアなんだから、I/Fをドキュメントに書き、カプセル化された内部実装は参照する必要をなくすべき、って奴と、オプソなんだからソース嫁、って奴の意見が割れてるのさ。
970デフォルトの名無しさん:2006/09/24(日) 16:04:02
>>969
そんなことまで言ってないよ。

継承してるなら継承元のドキュメントだけあれば良いけど、
継承していながらオーバーライドしてるメソッドがあるなら、
サブクラスのドキュメントにはそう明記すべき。

ハナっからドキュメントがなければないで「ソース嫁」でもいいけどね。
ドキュメントがありながら、それがミスリードするようなものであるならそれはまずい。
971デフォルトの名無しさん:2006/09/24(日) 16:32:42
ソースが仕様だと、仕様とバグの区別がつかなくなる希ガス
972デフォルトの名無しさん:2006/09/24(日) 16:36:50
第二引数をいくら増やしてもSEGVしなかった。

あと、Rubyには関数内関数なんてのはないから
内側のdefは外に出すべき。
973デフォルトの名無しさん:2006/09/24(日) 16:38:10
>>965
system32ディレクトリの中に、違うバージョンの
msvcrt-ruby18.dllとかがはいってるんじゃない?
974デフォルトの名無しさん:2006/09/24(日) 17:41:35
>>967
---------------------------------------------------------- Array#collect
    array.collect {|item| block }  -> an_array
    array.map    {|item| block }  -> an_array
------------------------------------------------------------------------
    Invokes _block_ once for each element of _self_. Creates a new
    array containing the values returned by the block. See also
    +Enumerable#collect+.

        a = [ "a", "b", "c", "d" ]
        a.collect {|x| x + "!" }  #=> ["a!", "b!", "c!", "d!"]
        a                          #=> ["a", "b", "c", "d"]

975デフォルトの名無しさん:2006/09/24(日) 19:20:17
>>974
refe やリファレンスマニュアルには載ってないよ。
976デフォルトの名無しさん:2006/09/24(日) 20:47:58
エポック(1970/01/01)からの経過秒数が既知の場合に
日付と時刻を出力するにはどうすればよいですか?

input : 10 (数字)
output : 1970/01/01 00:00:10 (文字列)
977デフォルトの名無しさん:2006/09/24(日) 20:57:15
リファレンスマニュアルのTimeクラスについてよく読め。
978976:2006/09/24(日) 21:08:44
>>976

自己解決
Time.at()で可能。ただし指定する秒数があまり大きいとNGを返す。
:in `at': bignum too big to convert into `long' (RangeError)
979デフォルトの名無しさん:2006/09/24(日) 21:50:00
Windowsで、数MBから数百MBのテキストを変換するスクリプトを
作ったのでWxRubyで簡単なGUIを作りました、が、

実行するとCPUの使用率が100%になって、ウィンドウが応答不能に
なります。一応、処理が完了すれば復帰します。

少々処理速度を犠牲にしても、きれいにGUIから実行できるよう
にしたいのですが、もしあればノウハウをご教示いただけませんでしょうか。

GUIとは別のThreadで処理させるなどしてみたのですが、そうしたら
今度は待てど暮らせど変換が終わらなくなってしまいました・・・。
980デフォルトの名無しさん:2006/09/24(日) 22:06:46
>>979
うーん。普通に、他の言語で作っても、そうなると思うけど(GUIが固まる)
別スレッドにしないと。Threadが上手く行かないのは、技術力の問題では?
981デフォルトの名無しさん:2006/09/24(日) 22:14:53
foreach = flip mapM_
というのに気づいて腹が立った
982981:2006/09/24(日) 22:16:36
誤爆
983デフォルトの名無しさん:2006/09/24(日) 22:23:16
>>980

技術力、全くもってその通りだと思います・・・。
で、申し訳ないんですが、もうちょっとだけ質問。

ものすごく基本的なことかもしれませんが、スレッドには
優先順位はつけられるけど、リソース配分みたいなことは
できないんですよね?

あと、馬力のいる処理をさせるときCPU使用率が100%に
ならないようにするいい方法はあるでしょうか。とりあえず
sleepをはさんだりしているんですが、それってありですか?
984デフォルトの名無しさん:2006/09/24(日) 22:26:07
>>983
Windowsしかしらんが、優先順位はつけられなかったとおも。
適時sleepして、CPUに処理返すのは有効手段かと。
985デフォルトの名無しさん:2006/09/24(日) 22:28:08
> 優先順位はつけられなかったとおも。
優先順位しかつけられなかったとおも。
986デフォルトの名無しさん:2006/09/24(日) 22:35:05
http-access2で、http-clinentオブジェクトが勝手にクッキーを処理するのを
やめさせたいんですが
987デフォルトの名無しさん:2006/09/24(日) 22:40:33
>>985
やっぱりそうですか。
とりあえずsleepで微調整していこうと思います。
ありがとうございました。
988デフォルトの名無しさん:2006/09/25(月) 23:14:44
Windows、ActiveScript-RubyにMeCabのバインディングを入れているには、
どのようにインストールすれば良いのでしょうか。
989デフォルトの名無しさん:2006/09/25(月) 23:17:25
>>988
「てい」が余計でした
990デフォルトの名無しさん:2006/09/27(水) 21:03:05
>>988
前にいっぺんCygwin版でやったけど、結構めんどくさいんだよねー
今はあきらめてChaSenをWin32APIで呼び出して使ってる
(『恋するプログラム―Rubyで作る人口無能』を参考にした)
MeCabも同じような方法で呼び出せるかも知れんけど
俺も初心者なので、あんまり詳しいところはよくわからない
991デフォルトの名無しさん:2006/09/27(水) 21:28:53
# ruby -v
ruby 1.8.5 (2006-08-25) [i386-freebsd5]

なのに、<%= RUBY_VERSION %>が 1.8.4 なのはがい出?
気持ち悪いんだけどどこ直せばいいんでしょうか?
992デフォルトの名無しさん:2006/09/27(水) 22:21:42
>>991
どうやってインストールしたの?
993デフォルトの名無しさん:2006/09/27(水) 22:59:12
>>992
ごめんなさい
/usr/bin/env ruby -e "p RUBY_VERSION"
してみたら 1.8.5 だったので、調べてみたところ tdiary のキャッシュのせいでした
<%= RUBY_VERSION %>って eval されないのね。お騒がせしてすみませんでした
994デフォルトの名無しさん:2006/09/27(水) 23:32:34
>>990
レスありがとうございます。茶筅ためしてみます。
995デフォルトの名無しさん:2006/09/28(木) 14:42:47
apt-get install `apt-cache search -n ruby1.8 | cut -d ' ' -f 1` irb1.8 rdoc1.8 ri1.8
をしたところ、
E: パッケージ irb1.8 が見つかりません、となるのですが、どうしたらインストールできますか?
ubuntuです。
996デフォルトの名無しさん:2006/09/28(木) 14:46:54
>>995
お、俺もubuntu使い。奇遇だね。
apt-cache search irb
で、ちゃんと見つけてくれてる?
997sage:2006/09/28(木) 14:51:12
ruby1.8 - Interpreter of object-oriented scripting language Ruby 1.8
と表示されました。
998デフォルトの名無しさん:2006/09/28(木) 15:11:07
>>997
それだけ?ズラズラいくつか表示された中に
irb1.8 - Interactive Ruby (for Ruby 1.8)
って、無い?
999デフォルトの名無しさん:2006/09/28(木) 15:12:38
もしくは、
irb - Interactive Ruby (irb)
でもいいや。
1000デフォルトの名無しさん:2006/09/28(木) 15:29:39
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。