トップページ⇒tech
1001コメント373KB

Ruby 初心者スレッド Part 50

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

前スレ
Ruby 初心者スレッド Part 49
http://toro.2ch.net/test/read.cgi/tech/1336507487/

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

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

逆引きRuby
http://www.namaraii.com/rubytips/
0112デフォルトの名無しさん2012/08/23(木) 03:17:55.02
Rubyじゃなくてプログラミングの問題かもしれませんがRubyでやってるのでここで質問します
操作Aのあと操作Cを行う,ということを繰り返したいのですが,
もし操作Cでエラーが出る場合はAとCの間に操作Bを行わなければなりません
操作A
while
begin 操作C
rescue 操作Bやってから操作C

0113デフォルトの名無しさん2012/08/23(木) 03:19:08.54
すいません途中で送信してしましました
今書いているプログラムが
操作A
while
 begin 操作C
 rescue 操作Bやってから操作C
 end
さらにCのあとにやりたいこと
end
0114デフォルトの名無しさん2012/08/23(木) 03:20:46.42
度々すみません…orz
>>113のように書いているのですが,操作A→Cだけで済むようなときにエラーが出てしまいます
こういうパターンって例外処理ではないのでしょうか?
0115uY2012/08/23(木) 03:35:51.05
begin
# 操作C
next ########################NEXT#########################
rescue
# 操作Bやってから操作C
end
# さらにCのあとにやりたいこと
0116デフォルトの名無しさん2012/08/23(木) 03:39:57.72
>>114
ちょっと話を整理して欲しい所

操作Cを実行せずに、操作Cでエラーが出るかは分からないのだから
「もし操作Cでエラーが出たら、操作Cの前に操作Bをやる」
という制御の流れは実現不可能だ

基本的な制御構造はA→C→A→C→……だと思われるので

while 条件
 操作A
 操作C
end

でいいと思う。ここにどう操作Bを足すかは、やりたいことによる
0117デフォルトの名無しさん2012/08/23(木) 03:48:46.33
>>116
ありがとうございます
今回は操作Bを行うきっかけが「Cができるかできないか」としか書けないので
例外を使う方法で考えてみました
なのでBは例外的に必要というよりは,「CができないならBをつかう」という一種の選択肢なのです
2回に1回くらいBを使わなければならないので...
0118デフォルトの名無しさん2012/08/23(木) 05:36:06.48
後出し後出し後出し後出し後出し後出し後出し

本当にそうとしか表現できないのなら、なにをしたいのか本当は自分でもわかっていない
>>112と>>117の時点でまったく別のことを喋っている
自分でもわかっていない粒度・抽象度のものを私たちが理解して回答してあげることはできない

ということで、いっそ全部喋るか、適切な粒度にざくざく切るという行為に時間かけろ
Rubyには条件分岐とループと例外によるジャンプしかないんだから
0119デフォルトの名無しさん2012/08/23(木) 06:50:57.47
初心者は例外使うなて
0120デフォルトの名無しさん2012/08/23(木) 07:15:20.40
メソッドは放っておいても何らかの値を返し、nilが偽として動作し、条件のcond部分での変数代入が日常でしかもcaseが賢いRubyでは
「例外を使うべき例外的場面」なんてのは例外使いまくって火傷どころか焼死しないとピンと来ない
公開ライブラリでないのなら、初心者はぜひ例外使いまくって泣いてください
0121デフォルトの名無しさん2012/08/23(木) 08:27:20.67
>>114
rescue節で実行している操作Cで出た例外を捕捉する記述がないから

begin
 操作C
rescue
 操作B
 retry # beginに戻る
end
0122デフォルトの名無しさん2012/08/23(木) 08:36:49.47
>>117
マニュアルの制御構造を参照してね。

begin
  〜
rescue ErrorA
  ErrorA例外時の処理
rescue
  StandardErrorとサブクラス例外時の処理
else
  例外が発生しなかった時の処理
ensure
  必ず実行する処理
end
0123デフォルトの名無しさん2012/08/23(木) 08:52:53.65
>caseが賢いRuby

else if を使いこなせない馬鹿のための syntax sugar
0124デフォルトの名無しさん2012/08/23(木) 09:29:22.65
elsif
0125uy2012/08/23(木) 09:31:21.62
case proc使ってないやつなんていんの?
どんな発展途上国からおこしの技術者だよ
0126デフォルトの名無しさん2012/08/23(木) 18:04:09.25
10101100000100000000101000000001 を "172.16.10.1" にしたいのですが、

> p IPAddr.new("10101100000100000000101000000001")
#<IPAddr: IPv6:1010:1100:0001:0000:0000:1010:0000:0001:0000:0000:0000:0000:0000:0000:0000/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff>

と解釈されてしまいます。自分でunpackして作るしかないのでしょうかね。。
0127デフォルトの名無しさん2012/08/23(木) 18:43:00.68
>>> socket.inet_ntoa(struct.pack('i4', socket.htonl(int('10101100000100000000101000000001', 2))))
'172.16.10.1'
0128デフォルトの名無しさん2012/08/23(木) 19:05:10.86
>>126
それだとエラーになったので、素直に2進数で渡してみたよ。
ruby1.9.1 -e "require 'ipaddr';p IPAddr.new(0b10101100000100000000101000000001,Socket::AF_INET).to_s;"
"172.16.10.1"
0129uy2012/08/23(木) 19:07:27.38
>>> "10101100000100000000101000000001".scan(/\d{8}/).map{|x|x.to_i(2)}*"."
'172.16.10.1'
0130デフォルトの名無しさん2012/08/23(木) 19:34:37.52
ありがとうございます、参考にしながらこうやりました。

a = "10101100000100000000101000000001"
p IPAddr.new(a.to_i(2) ,Socket::AF_INET).to_s
 => "172.16.10.1"
0131デフォルトの名無しさん2012/08/23(木) 19:56:56.34
俺の目には>>118が読解力なさ杉にしか見えないが
0132デフォルトの名無しさん2012/08/23(木) 20:07:18.83
一行目からして電波なんだから触らないでおけ
0133デフォルトの名無しさん2012/08/23(木) 20:11:58.61
フラミンゴ2羽犠牲「申し訳ない」 旭川市長陳謝 2012/8/23 19:43
http://www.nikkei.com/article/DGXNASDG2303P_T20C12A8CC1000/

 北海道旭川市の西川将人市長は23日の記者会見で、市が運営する旭山動物園から逃げた
ヨーロッパフラミンゴの捕獲作業で、フラミンゴをおびき寄せるために用意したおとり1羽が死に、
1羽が行方不明になったことを陳謝した。

 市長は「フラミンゴは1羽25万〜30万円。市民に損害を与えて申し訳ない。
犠牲になったフラミンゴにも申し訳ないと思っている」と述べた。

 2羽のフラミンゴはキタキツネに襲われたとみられ、動物園には電話で苦情が約50件寄せられた。
市長は「捕獲して戻すことが重要な役割だ」として捕獲作業を継続する方針を示した。
同時に「寒くなれば南に飛んでしまう可能性があるので、なるべく早く連れ戻したい」と述べた。

 紋別市・コムケ湖で今月17〜18日に行われた動物園による捕獲作業では、逃げたフラミンゴの捕獲に失敗し、
おとりで用意した4羽のうち2羽を失った。園は既に、おとりを使った捕獲の中止を決めている。〔共同〕
0134デフォルトの名無しさん2012/08/25(土) 09:42:26.82
1〜20までの数がランダムに並んだ配列を出力したいんですがどのようにすれば、うまくいくでしょう?

Scl = 20
num = [rand(Scl) + 1]

while num.size <= Scl
 elm = rand(Scl) + 1

 num.each {|i|
  if
   num[i] != elm
   num << elm
  end
 }

 puts "num_size = #{num.size}"
end

print num

これだと、同じ数が並ぶわ、配列のサイズもバラバラで全くうまくいきません
0135デフォルトの名無しさん2012/08/25(土) 09:51:32.76
(1..20).to_a.shuffle
0136デフォルトの名無しさん2012/08/25(土) 14:30:00.74
おぉ、1行で済むとは・・・
ただ、1.9では .to_a は使えない様なので arry.shuffle で良さそうですね 
ありがとうございました。
0137デフォルトの名無しさん2012/08/25(土) 15:32:57.30
(1..20).sort_by{rand}
とか考えたけど、shuffle1つで済むのか
やっぱりArrayとかEnumerableとかのメソッドは流し見して覚えておくべきだね
0138uy ◆gXFLM6waxs 2012/08/26(日) 00:57:04.78
暗記って
1日10個ずつ確実に覚えるよりも
1日100個を流し読みしたほうが効率いいんだよ
0139デフォルトの名無しさん2012/08/26(日) 14:04:13.44
rescueで特定の例外を捕捉したらwarnでメッセージを出力しているのですが、cronで実行した時のみwarnの出力を抑制するなんてできますか?
crontabの設定で対象のrubyプログラムの標準出力のみ/dev/nullにリダイレクトしていますが、rescueで捕捉したエラーについてはメールされるのを防ぎたいです。
warnでエラーを確認したいのは直接実行する時だけで、cron実行時は想定していないエラーのみ確認したいのです。
0140デフォルトの名無しさん2012/08/26(日) 14:26:31.17
>>139
ruby のコマンドラインオプションに -W0 を追加する
01411392012/08/26(日) 15:37:49.78
>>140
なるほど!ありがとうございます。
0142デフォルトの名無しさん2012/08/27(月) 23:56:21.48
ruby1.9にちゃんと付いてきているIDEってどのへんでしょうか?
Netbeansは打ち切られていて。。
0143デフォルトの名無しさん2012/08/27(月) 23:59:47.86
RubyMineとか。
0144デフォルトの名無しさん2012/08/28(火) 00:37:49.99
>>142
emacsのruby-modeって、rubyの方がサポートしてるんじゃなかった?
0145デフォルトの名無しさん2012/08/28(火) 22:47:30.79
2つの文章の類似度を判定するサンプルプログラムありませんか?
Ruby1.8でMeCabを使おうと思っているのですがすでにサンプルプログラム落ちてたりしませんかね…
0146デフォルトの名無しさん2012/08/28(火) 22:54:20.63
これこれこういう数式でこう表現されるようなことをプログラムでやりたい、というような言い方なら誰か教えてくれるかも
0147デフォルトの名無しさん2012/08/28(火) 23:00:53.46
>>145
MeCabと言ったら日本語解析しかないだろう。出てくる語句の頻度で判定するなんて言うまでもなく。

あ、質問者じゃないから。

migemoならプログラムから使ったことあったな。そういえばあの超便利ソフトもとはrubyか。
0148デフォルトの名無しさん2012/08/28(火) 23:01:09.83
なんてこった…CPANモジュールをnode.jsで動かしてしまうライブラリ「node-perl」
http://blog.64p.org/entry/2012/08/28/131329

rubyからCPANモジュールを動かすことは技術的に可能?
0149デフォルトの名無しさん2012/08/28(火) 23:01:35.25
>>147の前半は>>146宛。
0150デフォルトの名無しさん2012/08/28(火) 23:06:47.51
>>148
jsで、perlインタプリタを作るまでやるか!?
と思ったけどc++で書かれ、実体はバイナリなのね。
0151デフォルトの名無しさん2012/08/28(火) 23:19:46.07
>>145
意味的な話じゃなくて字面上の類似なら文字列の距離として
定義されているものを使えるように思う。
レーベンシュタイン距離とかハミング距離とか。
0152デフォルトの名無しさん2012/08/29(水) 00:33:19.21
>>145

こういうこと?

def norm doc
sum = 0.0
doc.each_value{|v| sum += v * v}
Math.sqrt(sum)
end

def cosine_similarity doc1,doc2
sum = 0.0
(doc1.keys & doc2.keys).each {|k| sum += doc1[k] * doc2[k]}
sum / (norm(doc1) * norm(doc2))
end

doc1 = {"私" => 1, "太郎" => 1} # 単語の頻度
doc2 = {"私" => 1, "花子" => 1}

puts cosine_similarity doc1,doc2
0153デフォルトの名無しさん2012/08/29(水) 00:46:21.53
>>145
参考までに。
Octopress/JekyllでGroongaによる類似文書検索機能を使う
http://arika.org/2012/07/28/jekyll-and-groonga-similar-search/
0154デフォルトの名無しさん2012/08/29(水) 05:02:47.75
そういえばmecab-rubyてどこいったの?
0155デフォルトの名無しさん2012/08/29(水) 18:10:00.84
「ruby2.0がかなりすごいらしい」ってコピペして回ってるのが居たんですが、1.9と比べて何が凄いんですか?
0156デフォルトの名無しさん2012/08/29(水) 20:57:05.07
下のような、module A と Class C を準備したのですが、同じI/F の module B も準備して
Class C を共通で使いたくなりました。file C.rb で require "A" を "B" 、A::hoge を B::hoge
にするだけですが、class C (file C.rb) は1つのままにしたいです。さらに、Class C を
インスタンスするときにA,B を指示する I/F にはしたくないです。module A,B の wrapper を
用意してclass C はそれを使い、module の切り替えは global チックに行いたいのですが、
その wrapperをどのように記述したらよいかが、わかりません。。


file A.rb
module A
module_function
def hoge(x,y)
end
end

file B.rb
module B
module_function
def hoge(x,y)
end
end

file C.rb
require "A"
class C
def initilize(z)
@x = z
def hoge(w)
A::hoge(@x,w)
end
end
0157デフォルトの名無しさん2012/08/29(水) 21:58:08.61
>>156
AとBを同時に使う必要が無いのであれば
AとBはクラス名を同じにしてそれぞれでrequire 'C'すればいんでね

そうでないなら例えばこんなん
class C
def self.m=(mod) ; @m = mod ; end
def self.m ; @m ; end
def hoge(w) ; self.class.m::hoge(@x,w) ; end
end
C.m = A
0158uy2012/08/30(木) 02:01:13.96
module A
  module_function
  def hoge x , y
    p :a
  end
end

module B
  module_function
  def hoge x , y
    p :b
  end
end

class C
  class << self
    attr_accessor :mod
  end
  def initialize z
    @x = z
  end
  def hoge w
    self.class.mod.method(__method__).call @x , w
  end
end
C.mod = B
c = C.new 2
c.hoge 4
0159デフォルトの名無しさん2012/08/30(木) 23:22:57.36
>>167, >>158 さん、ありがとうございます。
やりたいことができました。本当に助かりました
動的なケースと静的なケースどちらも教えて
いただけて感激です。

確かに静的なケースでは、異なるファイル名で
準備しておいて require しながら起動すれば、
自然に使えますね。依存関係でこり固まっていた
思考が溶けた気分です。
0160デフォルトの名無しさん2012/08/30(木) 23:23:43.38
>>167 でなくて、>>157 さんの間違いです。すみません
0161デフォルトの名無しさん2012/08/31(金) 06:45:57.23
>>137
> (1..20).sort_by{rand}
それ、考えなしの安直プログラマーが高確率でやらかす、典型的なやってはいけないアンチパターンだな。
これは偏りが発生するのでアウト。確率論の問題としては良い題材だから、理由は自分で考えてみるといい。
ぐぐるとこれと同じパターンをやらかす人間が多くて唖然とするが。
0162デフォルトの名無しさん2012/08/31(金) 10:42:37.54
>>161
shuffleが無かった時代に、偏ってもいいからサクッと書きたい用途でよく使われてたんだよ
当時から「ちゃんと混ぜるならちゃんと書く」という風に知られてた
0163デフォルトの名無しさん2012/08/31(金) 11:36:15.90
そもそも言うほど偏り有るの?
sort_by{rand(20)} とか sort{rand-0.5} とかやるならともかく
0164デフォルトの名無しさん2012/08/31(金) 12:21:11.02
irb> a=(1..6).to_a; r=Hash.new{|h,k| k=0}; 1000000.times{r[a.shuffle] +=1}; d=r.values; p Math::sqrt(d.inject(0){|x,y| x+y*y}/d.size-(d.inject(0){|x,y| x+y}/d.size)**2)
62.6418390534633
irb> a=(1..6).to_a; r=Hash.new{|h,k| k=0}; 1000000.times{r[a.sort_by{rand}] +=1}; d=r.values; p Math::sqrt(d.inject(0){|x,y| x+y*y}/d.size-(d.inject(0){|x,y| x+y}/d.size)**2)
61.37589103222861

うん、たいして変わらんですな
0165デフォルトの名無しさん2012/08/31(金) 12:47:16.12
1:def hoge
2:    a = [1,2,3,4,5]
3:
4:    a.each do |b|; c = b; end
5:    p c
6:end

これだとcのスコープが4行目内だけになってエラーになりますが
そこで3行目に
 c = nil
と入れているんですがこれでいいでしょうか?
もっとスマートな方法はないでしょうか
0166デフォルトの名無しさん2012/08/31(金) 12:53:56.71
eachの代わりにfor b in a; c = b; end
0167デフォルトの名無しさん2012/08/31(金) 13:17:29.57
>>165
スコープがそのようになっているんだから、そのように書くのがいちばんスマートだと思うがなにか問題ある?
0168uy2012/08/31(金) 14:40:17.28
1:def hoge
2:    a = [1,2,3,4,5]
3:    p a.last
6:end
0169uy2012/08/31(金) 14:46:12.18
意味把握した
変数宣言がイヤだって事か
元コードみないとわからんけど、eachじゃなくてinjectとかeach_with_objectでやって
そのイテレータの戻り値をcに格納すれば
0170デフォルトの名無しさん2012/08/31(金) 15:17:26.34
>>161
このイディオムはsort_byだから問題ないんだろうと思ってたが
0171デフォルトの名無しさん2012/08/31(金) 15:37:46.80
161はどんなドヤ顔で言ってんだろうw
いるよねー、ランダムのラの字を行った瞬間に脊髄反射で食って掛かるひとw
0172デフォルトの名無しさん2012/08/31(金) 22:21:59.27
>>167-169
ありがとうございます
すいません
説明不足でしたがブロック内で初めて変数を使うとスコープがそのブロック内になってしまうので
>>165のようにブロックの前で変数を宣言するのか(グローバル変数は使うべきではないですよね)もっといい方法があるのか知りたかったということです
>>168>>169
なるほどこれは便利ですね
0173デフォルトの名無しさん2012/08/31(金) 22:45:17.75
ちなみに>>161が言いたかったであろう偏るようなパターンってどんなの?
>>137は偏るの?
0174デフォルトの名無しさん2012/09/01(土) 10:10:46.31
>>173
>>163のパターンは偏るはず
sort_by{rand}はほとんど偏らないけどshuffleよりかなり重い
0175デフォルトの名無しさん2012/09/02(日) 14:15:38.97
module MyModule
def a; p "this is method a"; end
end
class MyClass
include MyModule
def b; p "this is method b"; end
a rescue p "no such method"
b rescue p "no such method"
end

MyClass.new

これでメソッドaとbがないと怒られてしまうのは何ででしょう?
クラス定義の中ではレシーバselfはカレントクラスであるMyClassを参照するはずなのでメソッドa,bを呼べるのでは、と思ったのですが…
0176デフォルトの名無しさん2012/09/02(日) 14:31:05.87
ものすごくおおざっぱに言うと、ふつうのincludeは引数モジュールのメソッドをインスタンスメソッドとして追加する
そして、インスタンスメソッドはクラス定義のclass...endの文脈では呼べない
class C
def a; end
a
end
が3行目でNoMethodError起こすのと同じ理屈
これで納得しない場合はincludeとはなんぞやという話になる
0177デフォルトの名無しさん2012/09/02(日) 15:36:55.01
ゴミみたいなスコープだよね
0178デフォルトの名無しさん2012/09/02(日) 19:00:21.38
>>176
調べてみたりしてなんとなくincludeの役割がわかりましたが、次のコードが動かない理由がわからないです

module MyModule
def self.a; p "this is method a"; end
end
class MyClass
include MyModule
end
MyClass.a

aメソッドをクラスメソッドではなくインスタンスメソッドとして定義してextendしたら MyClass.a で実行できることは確認しました
includeもextendもクラスメソッドは相手にせず、インスタンスメソッドしか見ないという事なんでしょうか
0179デフォルトの名無しさん2012/09/02(日) 20:00:57.17
Rubyに本来クラスメソッドはない。
あるのはクラスインスタンスのインスタンスメソッド。
あとはincludeとextendが何をするものかを考えれ。
0180デフォルトの名無しさん2012/09/02(日) 20:42:44.15
>>179
横から勝手に訂正させてもらうね
×あるのはクラスインスタンスのインスタンスメソッド。
○あるのはクラスインスタンスの特異メソッド。
0181デフォルトの名無しさん2012/09/02(日) 20:44:52.28
Rubyに存在するのはインスタンスメソッドだけ、というのは昔俺も思ってた
普段考えるぶんにはそれでもいいし統一概念ですっきりするんだけど、でも本当はやっぱり違う…
0182デフォルトの名無しさん2012/09/03(月) 00:25:02.82
モジュールをあるクラスにインクルードして使う場合、
モジュール側のメソッド内でそのクラスのインスタンス変数にアクセスするのって普通ですか?
0183uy2012/09/03(月) 05:05:18.87
そのくらいはいいけど
個人的な意見でいえばそこら辺明らかに仕様がイかれてるから
バージョンアップ時に動かないソース作りたくなければ
あまりこだわったことやらない方がいいと俺様は思う
0184デフォルトの名無しさん2012/09/03(月) 06:30:18.49
>>182
システム上および慣習上の問題はないよ
特定のクラス専用の実装べったりのmix-inだね
だいたいにおいてあとあと後悔したりもするが、それが起こらない限りは便利だろう
0185デフォルトの名無しさん2012/09/03(月) 08:23:23.82
>>178
def には役目が2つある
ひとつは、その文脈でのメソッドの定義(予約)

module M
def a; end
end

class C
def b; end
end

これらはメソッドの定義行為であって、その時点で実際にメソッドが作られるわけではない
(include先が)newしたときに、生成オブジェクトに対してインスタンスメソッドとしてどさっと追加される
そしてもうひとつ、既に存在する特定のオブジェクトに対する特異メソッドの追加

def obj.s; end

これは特異メソッドの追加で、オブジェクトobjに対して即座に特異メソッドsを追加する

module MyModule
def self.a; p "this is method a"; end
end

でのdefはその文脈におけるselfの指すオブジェクト(ModuleクラスのオブジェクトMyModule)に特異メソッドを追加する行為であって、クラスやモジュールにメソッドを定義することではない
モジュールオブジェクトMyModuleは定義されたメソッドを持ってないので、includeしようがextendしようがメソッドは使えない
0186デフォルトの名無しさん2012/09/03(月) 09:38:20.46
質問です
初歩的すぎるかもしれませんm(_ _)m
1.9だとerbコマンドは使えないんでしょうか?
参考にしている本は1.8前提だったので;
USB(F:)に入れたためコマンドプロントから入力している状況です

F:\>ruby erb hello.txt.erb

と入力すると、ファイルかディレクトリが見つかりませんというメッセージが出ます
hello.txt.erbというファイルはFドライブに入れています
わかる方教えて頂きたいです
0187デフォルトの名無しさん2012/09/03(月) 09:45:00.50
erbは添付されてるはずだよ
実行できないとしたらそれはcmd.exeが実行ファイルを見つけられないだけだろう

なに言ってるかわからないのなら、フォルダ/ディレクトリと実行パスの勉強をするといい
どうせこれからもずっと必要になる知識だ
0188デフォルトの名無しさん2012/09/03(月) 09:49:38.88
素早いお返事ありがとうございます!!!
回答を頂けて安心しました
勉強します!
0189デフォルトの名無しさん2012/09/03(月) 17:31:55.82
ruby.exeがある場所にerb.batもありませんか?
あれば
ruby erb ではなくてerbだけで実行できるはずですが
01901822012/09/03(月) 21:53:13.15
ありがとうございます
やはり下位のものを上位に持っていくことは極力避けるべきですかね
まだ歴が浅いので、システム面や慣習に関する言及は助かります
0191デフォルトの名無しさん2012/09/03(月) 22:04:43.67
>>190
だから管理できる範囲であるならどうでもいいって
ユーザーがincludeして使うモジュールを作ってるわけでも、ファイル数が30超えてるめんどくさいライブラリを作ってるわけでもあるまい
あるオブジェクトのメソッドがクラス定義に書いてあったものかモジュールで追加されたものかを気にする人はまずいない
ほんとにそっちのほうがプログラミングに便利だと確信するのなら、メソッド定義をごっそりモジュールに移すといい
0192デフォルトの名無しさん2012/09/04(火) 06:12:17.13

def f
p 3
end

lambda(&f).call

これを実行すると

:6:in `<main>': wrong argument type Fixnum (expected Proc) (TypeError)

と、でるんですけど動作原理が良く分かりません
どうなっているんでしょうか?


0193デフォルトの名無しさん2012/09/04(火) 06:36:43.28
まずfが普通に評価されて3になる。つまりこれと同じ
lambda(&3).call
3はProcじゃないしto_procも定義されてないからlambda(&3)でエラー
0194デフォルトの名無しさん2012/09/04(火) 06:59:32.42
試したかったことって要は __send__(:f) とか self.method(:f).call とかでいい?
0195デフォルトの名無しさん2012/09/04(火) 08:37:00.94
どちらがエレガントで負荷的にも良いか質問です。
hogeというメソッドを何度も実行したいとき、
1000.times { B.hoge }
というよりも、
app = A.new
1000.times { app.hoge }
とやるほうがいいのでしょうか?

class A
def initialize
...
end
def hoge
...
end
end

class B
def self.hoge
...
end
end
0196デフォルトの名無しさん2012/09/04(火) 10:45:31.38
100万回連続実行したときに0.001秒の遅れが数億円の損害になるような環境であって、
なおかつどうしてもRubyでやらなければ家族がどうなるかわからないぞと脅されているのなら、俺なら前者で書く
なぜなら、定数Bとローカル変数appを比べたとき、絶対的に定数Bのほうが参照が速いから

そうでないのなら意味的に妥当なほうでやるといい
このためにクラスメソッドっぽくない使い方するクラスメソッドをわざわざ作るようなことはしない
0197デフォルトの名無しさん2012/09/04(火) 10:55:13.62
「メソッドが使いたいだけであって、オブジェクト作りたいわけじゃないんだよね」という感覚はないでもないことがないでもない
もしそうならクラスメソッドとかの出番だろうか
0198デフォルトの名無しさん2012/09/04(火) 12:00:10.98
あとあとめんどくさくないことが多いのはAのパターンだと思う
効率とエレガントさに関してはどっちも変わらん
0199デフォルトの名無しさん2012/09/04(火) 22:09:07.93
家族を見殺しにしてでも、cで書くよ
0200デフォルトの名無しさん2012/09/09(日) 20:24:13.08
ruby-openglが、ruby 1.9.3 でインストできない。

1.8.7使えってことかよ。
0201デフォルトの名無しさん2012/09/09(日) 21:20:17.29
>>200
ttp://ruby-opengl.rubyforge.org/build_install.html
まあ最新が2009年なので現在の環境ではどーやっても動作しない可能性はないでもない
02021952012/09/10(月) 02:15:56.97
196-199
スピードと使い勝手の勘所、
よくわかりました、あざっす!
0203デフォルトの名無しさん2012/09/10(月) 10:06:55.79
Bは毎回initializeする訳ですか?
0204デフォルトの名無しさん2012/09/10(月) 10:29:53.45
Ruby が class B ... end を最初に見かけたときに1度だけ B = Class.new 相当をしてる
メソッドを1回使いたいだけなのに毎回オブジェクトを作るのはなんかアレだということが起こらないという点でもエコ

っていうか状態を保持利用しない単発野良メソッドでいいならモジュールのクラスメソッドでいい

module M
def M.mes
end
end

M.mes
M.mes
M.mes
0205デフォルトの名無しさん2012/09/13(木) 11:55:57.43
mtime, atimeを変更するメソッドってありますか?unixでいうと
touch -t yymmddみたいなものです。
File.mtime File.atimeはただ取得するだけみたいなのです。
system(touch -t yymmdd)するしかないですか?
02062052012/09/13(木) 11:57:46.80
あ,すいません。「特定の日付」に変更という意味です。
0207デフォルトの名無しさん2012/09/13(木) 12:02:41.51
utime
02082052012/09/13(木) 12:15:20.71
>>207
ありがとうございました。
0209デフォルトの名無しさん2012/09/13(木) 13:12:39.38
どういたしまして
0210デフォルトの名無しさん2012/09/14(金) 11:11:18.61
Ruby始めようと思っていきなりプログラミング言語Ruby買ったけどちょっと難しいな
C、Java、Pythonは経験あるんだが
0211デフォルトの名無しさん2012/09/14(金) 12:36:26.71
言語が平易だからといって言語本体の解説書が平易だとは限らない
素直に入門書を手に取るべきだったな
■ このスレッドは過去ログ倉庫に格納されています