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速度较慢,因为它会执行两次哈希查找以返回缓存值,但是当您逐行读取它时,它比该cached方法更有意义。

我认为使用隐式返回是使 ruby​​ 很棒的事情之一,但我一直质疑它们在设置值时的使用。

所以我的问题是:你会使用隐式 return from(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

在这种情况下,较短的是优选的。通常=在子表达式中使用是不赞成的,但在这里没关系。

于 2012-10-30T09:22:51.620 回答
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 回答