0

[]=メソッド使用時にRubyの暗黙の戻り値を使っていいのか迷っています

[]=使用rb_hash_asetして返されますval- http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-5B-5D-3D

ここに私が何を意味するかを示す小さなコードがあります:

require 'benchmark'
CACHE = {}
def uncached_method(key)
    warn "uncached"
    rand(100)
end
def cached(key)
  CACHE[key] || (CACHE[key] = uncached_method(key))
end
def longer_cached(key)
  return CACHE[key] if CACHE[key]
  CACHE[key] = uncached_method(key)
  CACHE[key]
end

Benchmark.bm(7) do |x|
    y = rand(10000)
    cached(y)
    x.report("shorter:") { 10000000.times do cached(y) end }
    x.report("longer:") { 10000000.times do longer_cached(y) end }
end

もちろんlonger_cached、キャッシュされた値を返すために2つのハッシュルックアップを行うため、遅くなりますが、行ごとに読み取ると、メソッドよりも理にかなっていますcached.

暗黙の戻り値を使用することは Ruby を素晴らしいものにするものの 1 つだと思いますが、値を設定するときの暗黙の戻り値の使用には常に疑問を抱いていました。

だから私の質問は: からの暗黙のリターンを使用し(hash[key] = val)ますか?

4

4 に答える 4

2

||=この場合も演算子を使用できます。

CACHE[key] ||= uncached_method(key)

これは非常に一般的なイディオムです。

于 2012-10-30T09:41:02.350 に答える
1

これまで誰も言及していないという理由だけで: の戻り値に依存していませんHash#[]=。とにかく、その戻り値は無視されます。

class ReturnFortyTwo
  def []=(*)
    return 42
  end
end

r = ReturnFortyTwo.new

r[23] = 'This is the value that is going to be returned, not 42'
# => 'This is the value that is going to be returned, not 42'

Ruby では、代入式は常に代入される値に評価されます。例外なし。これは、言語仕様によって保証されています。ですから、それに頼ることは悪いことではないと思います。

于 2012-10-30T12:05:18.033 に答える
0

できるだけシンプルでクリーンに保ちます(高速でもあります):

def cached(key)
  value = CACHE[key]
  unless value
    value = uncached_method(key)
    CACHE[key] = value
  end
  value
end
于 2012-10-30T10:50:03.690 に答える
0

この場合、短い方が好ましいです。通常=、部分式で使用されると眉をひそめられますが、ここでは問題ありません。

于 2012-10-30T09:22:51.620 に答える