Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比如让Ruby进来_Ruby_Lexical Scope - Fatal编程技术网

比如让Ruby进来

比如让Ruby进来,ruby,lexical-scope,Ruby,Lexical Scope,我曾经写过let-like表达式——具有词法范围 所以我写了我自己的(很遗憾,但它会在多个线程中失败): 我在google中搜索ruby的这种构造(可能是额外的块定义),但没有找到。也许我弄丢了什么?在这种情况下,人们使用什么ruby 你知道,对不起,我的英语不好 UPD:I foget提供使用示例: @inst_var = 1 with :inst_var => 2 do puts @inst_var end puts @inst_var 输出: 2 1 不能指定要初始化的值,但

我曾经写过let-like表达式——具有词法范围

所以我写了我自己的(很遗憾,但它会在多个线程中失败):

我在google中搜索ruby的这种构造(可能是额外的块定义),但没有找到。也许我弄丢了什么?在这种情况下,人们使用什么ruby

你知道,对不起,我的英语不好

UPD:I foget提供使用示例:

@inst_var = 1
with :inst_var => 2 do
  puts @inst_var
end
puts @inst_var
输出:

2
1

不能指定要初始化的值,但可以将变量声明为该块的显式局部变量:

x = 'external value'
puts x
[1,2,3].each do |i; x|
  x = i
  puts x
end
puts x
这将导致:

external value
1
2
3
external value
一个想法:

class Object
  def let(namespace, &block)
    namespace_struct = Struct.new(*namespace.keys).new(*namespace.values)
    namespace_struct.instance_eval(&block)
  end
end

message = let(language: "Lisp", year: "1958", creator: "John McCarthy") do
  "#{language} was created by #{creator} in #{year}"
end
单值范围映射更显式,因为可以在块参数中命名变量。这个抽象被称为
管道
进入
范围
peg
,…,你可以说,都是一样的:

class Object
  def as
    yield self
  end
end

sum = ["1", "2"].map(&:to_i).as { |x, y| x + y } #=> 3

什么是let-like表达式?@Andrew:let表达式在许多语言中都有使用(LISP、Haskell、ML等)。值得注意的是,在本例中,
i
也是本地块。两个很好的建议都提供了一种干净的方式来扩展语言以满足您的需要。
class Object
  def as
    yield self
  end
end

sum = ["1", "2"].map(&:to_i).as { |x, y| x + y } #=> 3