将lambda应用于对象

asi*_*niy 9 ruby lambda metaprogramming

假设我有一个变量和lambda在某处定义

phone = "1(234)567-89-01"
lambda = -> { gsub(/[^0-9]/, '') }
Run Code Online (Sandbox Code Playgroud)

我怎样才能将lambda应用到手机上12345678901

PS我知道我可以采用以下方法:

lambda = -> (arg) { arg.gsub(/[^0-9]/, '') }
lambda.call(phone)
#=> "12345678901"
Run Code Online (Sandbox Code Playgroud)

但我想要简洁.

And*_*eko 15

您可以使用BasicObject#instance_exec:

phone.instance_exec &lambda
#=> "12345678901"
Run Code Online (Sandbox Code Playgroud)

  • 好东西@AndreyDeineko,关于这个的好处是它不会改变原来`phone`的状态(在exec之后,手机var仍然是``1(234)567-89-01"`)...所以在为了使用新值:`new_phone = phone.instance_exec(&lambda)` (3认同)