Ruby与计算机科学相关的良率特征

我最近发现了Ruby的块和屈服特征,我想知道:这在计算机科学理论方面适合什么? 它是一种函数式编程技术,还是更具体的东西?


Ruby的yield不像C#和Python中的迭代器。 一旦你理解了Ruby中的块如何工作, yield本身实际上是一个非常简单的概念。

是的,块是一种功能性编程功能,即使Ruby不是一种功能正常的语言。 事实上,Ruby使用lambda方法创建块对象,这是从Lisp的语法中借用来创建匿名函数的 - 这就是块的功能。 从计算机科学的角度来看,Ruby的块(和Lisp的lambda函数)是闭包。 在Ruby中,方法通常只占用一个块。 (你可以传递更多,但很尴尬。)

Ruby中的yield关键字只是调用已被赋予方法的块的一种方式。 这两个例子是等价的:

def with_log
  output = yield # We're calling our block here with yield
  puts "Returned value is #{output}"
end

def with_log(&stuff_to_do) # the & tells Ruby to convert into
                           # an object without calling lambda
  output = stuff_to_do.call # We're explicitly calling the block here
  puts "Returned value is #{output}"
end

在第一种情况下,我们只是假设有一个区块并说要叫它。 另一方面,Ruby将块封装在一个对象中,并将其作为参数传递。 第一个效率更高,可读性更强,但效果相同。 你会打电话给任何一个这样的人:

with_log do
  a = 5
  other_num = gets.to_i
  @my_var = a + other_num
end

它会打印出分配给@my_var 。 (好吧,这是一个完全愚蠢的功能,但我认为你明白了。)

块被用于Ruby中的很多事情。 几乎在每个地方你都会使用像Java这样的语言循环,在Ruby中用取代块的方法取代它。 例如,

[1,2,3].each {|value| print value} # prints "123"
[1,2,3].map {|value| 2**value}    # returns [2, 4, 8]
[1,2,3].reject {|value| value % 2 == 0} # returns [1, 3]

正如Andrew指出的那样,它也常用于打开文件和其他许多地方。 基本上任何时候你有一个可以使用一些自定义逻辑的标准函数(比如排序数组或者处理文件),你会使用一个块。 还有其他一些用途,但是这个答案已经很久了,恐怕会造成体质较差的读者心脏病发作。 希望这会消除这个话题的混乱。


产量和块数多于单纯的循环。

Enumerating enumerable系列包含一系列可以通过枚举完成的事情,比如询问某个组的任何成员的陈述是否为真,或者对于所有成员都是如此,或者搜索满足某个条件的任何或所有成员。

块对变量范围也很有用。 它不仅仅是方便,它可以帮助设计良好。 例如,代码

File.open("filename", "w") do |f|
  f.puts "text"
end

确保在完成文件流时关闭文件流,即使发生异常,并且一旦完成后该变量就超出范围。

一个休闲的谷歌没有拿出一篇关于红宝石块和收益的好博客文章。 我不知道为什么。

回应评论

我怀疑它因为块结束而关闭,而不是因为变量超出了范围。

我的理解是,当指向一个对象的最后一个变量超出范围时,除了该对象符合垃圾回收的条件外,没有什么特别的事情发生。 不过,我不知道如何确认这一点。

我可以证明文件对象在垃圾收集之前会被关闭,这通常不会立即发生。 在以下示例中,您可以看到第二个puts语句中的文件对象已关闭,但尚未进行垃圾回收。

g = nil
File.open("/dev/null") do |f|
  puts f.inspect # #<File:/dev/null>
  puts f.object_id # Some number like 70233884832420
  g = f
end
puts g.inspect # #<File:/dev/null (closed)>
puts g.object_id # The exact same number as the one printed out above,
  # indicating that g points to the exact same object that f pointed to

我认为yield声明来源于CLU语言。 我总是怀疑Tron的角色是否也是以CLU命名的......

链接地址: http://www.djcxy.com/p/25819.html

上一篇: Ruby's yield feature in relation to computer science

下一篇: How to set Authenticity token..?