Smalltalk、Perl、Python和Ruby之间的集合和流类等价性

7

我虽然有一些Python,Perl和Ruby等语言的经验,但是我已经在Smalltalk上开发了一段时间。有一些非常基本的Smalltalk类非常流行,可以跨多个Smalltalk实现:

FileStream
ReadWriteStream
Set
Dictionary
OrderedCollection
SortedCollection
Bag
Interval
Array

在Python、Perl和Ruby中,哪些类可以作为等效或有效的语义替代?我找到了几个比较语法的页面,但是当涉及到核心和基础库的翻译时似乎帮助不大。

我也想知道Python、Perl或Ruby中是否有一个基础或核心类,在Smalltalk中不存在或反之亦然?


1
显然(从答案中可以看出),你只需要了解一点Smalltalk和其他任何一种语言中的一些内容,才能有用地回答这个问题。即使答案“不太可能被接受”,发布答案也是有价值的。如果你认为它“过于开放,无法直接回答”,那么你应该投票关闭。 - agf
我不理解你的主张。你能澄清一下吗?这似乎是一个具体问题,有明确的答案。 - user869097
我是在回复一条已被删除的评论。 - agf
3个回答

7

Perl

我会回答关于Perl的问题,因为我精通Perl和Smalltalk两种语言。

Smalltalk的字典类型(Dictionary)与Perl的哈希(hash)类型相似。字典类型使用对象等价性作为键值,而Perl则使用简单字符串作为键值,因此其灵活性有所受限制。

Smalltalk的有序集合(OrderedCollection)与Perl的数组类型类似。

Smalltalk的FileStream类型有些像Perl的文件句柄(filehandles),因为它们都代表着一个数据流,指向外部文件或设备。

以上就是所有内容了,因为Perl只有哈希、数组和文件句柄这几种基本类型。 :)


使用 Hash::Util::FieldHash 函数,您可以获得哈希表,其键是指向对象和其他类型的数字化指针,并且可以在 CLONEing 期间幸存并随其所引用的对象一起被 GCed。 - MkV
请添加最适合的CPAN模块名称。 - daxim

4

Ruby

FileStream         -> File
ReadWriteStream    -> IO (or other things that duck type like it)
Set                -> require 'set', then use the Set class
Dictionary         -> Hash
OrderedCollection  -> Array
SortedCollection      nothing similar
Bag                   nothing similar
Interval           -> Range
Array                 Ruby has no fixed-length collection class.

2

Python

FileStream -> file
ReadWriteStream -> file
Set -> set
Dictionary -> dict
OrderedCollection -> list
SortedCollection -> no equivalent object (must call sort on a list)
Bag -> no equivalent object (must implement using dict)
Interval -> no equivalent object (but a range() function exists for making lists)
Array -> no equivalent (tuple is read-only, fixed length.  list is variable length)

需要注意的是,Python 2.7 中有一个 collections.Counter 对象与 Bag 等价。


heapq 是一个部分排序的集合。array.array 是否类似于 Smalltalk 的 Array?另外,我认为 collections.Counter(Python 2.7)是一个 Bag。那么 sliceislice 对于 Interval 呢? - agf
Python的array.array很接近,但它只能保存相同类型的对象。我不确定如何用切片来替代Interval。不过,考虑一下,xrange可能是更合适的等价物。但在Python 3.0中,range正在变成一个增强的xrange()。 - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接