Ruby相当于一个javascript自执行功能

bra*_*rad 5 javascript ruby

我在javascript中做了很多

some_var || some_var = function(){ return "blah"}();
Run Code Online (Sandbox Code Playgroud)

我想知道红宝石中的等价物是什么,所以我能做到

some_var ||= # sequence of operations
Run Code Online (Sandbox Code Playgroud)

编辑

Proc.new.call引起了我的注意,但我也是在某人的代码中遇到过这个:

a ||= begin
  # do some stuff
  # return some stuff
end
Run Code Online (Sandbox Code Playgroud)

这在功能上等同于使用Proc.new.call??

edit2 人们似乎对我想要实现的目标感到困惑.想象一下这在javascript中:

function someExpensiveFunction(){
  # do some really expensive stuff
  return "some expensive calculations"
}

a || a = someExpensiveFunction();
Run Code Online (Sandbox Code Playgroud)

显然设置a一次......一次调用昂贵的函数...在这种情况下我不关心范围,我只需要我的返回值是一个计算的事件序列而不是单个值.

我很确定我上面的例子a ||= begin; ... end;是等价的......

Mat*_*att 2

根据您的评论:

不关心范围...只是想要一个干净的语法来使用涉及多行代码的 ||= 设置变量

我不确定我是否理解为什么你觉得你不必使用 ||= 和 lambda。例如,您可以使用

if(some_var.nil?)
   # do some stuff
   some_var = result_of_doing_some_stuf
end
Run Code Online (Sandbox Code Playgroud)

或者,正如您在示例中所说的那样:

a ||= begin
  # do some stuff
  # return some stuff
end
Run Code Online (Sandbox Code Playgroud)

我不清楚为什么你必须使用 proc 或 lambda。

但如果您一心想使用 ||= 和 lambda,您可以这样做:

calculate = lambda { 1 + 1 }
some_var ||= calculate.call
Run Code Online (Sandbox Code Playgroud)