在Ruby中获取lambda函数的名称作为字符串

时间:2017-10-03 19:17:40

标签: ruby string function lambda

我将lambda函数定义为

my_lambda = lambda { |x| 100 * x }

我将此函数作为另一个函数的输入传递,该函数需要验证其标识,如:

def function_verifier(func)
  if func.to_s == "my_lambda"
    return "ok"
  else
    return "mismatch!"
  end
end

但是当我将my_lambda作为输入传递给此函数时,命令func.to_s将返回"#<Proc:0x0000a973516680@(pry):14 (lambda)>"而不是"my_lambda"

如何将my_lambda的函数句柄转换为字符串"my_lambda"

1 个答案:

答案 0 :(得分:2)

这不会奏效,因为您将proc传递给function_veriferproc并不知道其值是多少的变量。您可以执行以下操作。

my_lambda = lambda { |x| 100 * x }
  #=> #<Proc:0x000000008a1790@(irb):746 (lambda)>
MY_LAMBDA_OBJECT_ID = my_lambda.object_id
  #=> 4525000

def function_verifier(func)
  func.object_id == MY_LAMBDA_OBJECT_ID ? "ok" : "mismatch!"
end

function_verifier(my_lambda)
  #=> "ok"

your_lambda = my_lambda
  #=> #<Proc:0x000000008a1790@(irb):746 (lambda)>
your_lambda.object_id
  #=> 4525000
function_verifier(your_lambda)
  #=> "ok"

my_lambda = lambda { |x| 99 * x }
  #=> #<Proc:0x000000009116d0@(irb):768 (lambda)>
my_lambda.object_id
  #=> 4754280
function_verifier(my_lambda)
  #=> "mismatch!"