9

我想知道是否或如何将函数映射到哈希值。

例如:----开始上课------------

def foo(var)
    return var + 2
end

hash_var = { func => foo() }

----结束课堂--------------

这样我以后可以打电话

Class::hash_var["func"][10]

或者

Class::hash_var["func"](10)

那将返回12?

4

5 回答 5

10

你可以使用method方法。

def foo(var)
      return var + 2
end

hash_var = { :func => method(:foo) }

hash_var[:func].call(10)
于 2012-10-23T15:26:32.197 回答
4

函数/方法是 Ruby 中少数不是对象的事物之一,因此您不能将它们用作散列中的键或值。与作为对象的函数最接近的东西是proc。所以你最好使用这些......

其他答案几乎列出了如何将 proc 作为值放入散列的所有可能方法,但我还是会总结一下;)

hash = {}

hash['variant1'] = Proc.new {|var| var + 2}
hash['variant2'] = proc     {|var| var + 2}
hash['variant3'] = lambda   {|var| var + 2}

def func(var)
  var + 2
end

hash['variant4'] = method(:func) # the *method* method returns a proc
                                 # describing the method's body 

评估过程也有不同的方法:

hash['variant1'].call(2) # => 4
hash['variant1'][2]      # => 4
hash['variant1'].(2)     # => 4
于 2012-10-23T16:01:41.337 回答
3

您可以将值设置为 Proc 并调用它。

hash_var = {
  'func' =>  proc {|x| x+2}
}

hash_var['func'].call(10) #=> 12
于 2012-10-23T15:24:09.530 回答
2

尝试使用 lambda

hash_var = { :func => lambda { |var| var + 2 }}
hash_var['func'].call(5) #=> 7
于 2012-10-23T15:27:55.737 回答
0

另一种选择是:

def foo(name)
    puts "Hi #{name}"
end

def bar(numb)
    puts numb + 1
end

hash_var = { func: :foo, func2: :bar }
send hash_var[:func], "Grid"
# => Hi Grid
send hash_bar[:func2], 3
# => 4

以下是有关#send方法的一些信息send() 在 Ruby 中的作用是什么?

于 2019-04-03T17:59:24.723 回答