Erlang与Ruby列表推导式比较

4

我刚开始学习 Erlang,非常喜欢它的列表推导式语法,例如:

Weather = [{toronto, rain}, {montreal, storms}, {london, fog}, {paris, sun}, {boston, fog}, {vancounver, snow}].                          
FoggyPlaces = [X || {X, fog} <- Weather].

在这种情况下,FoggyPlaces将被解释为“london”和“boston”。
在Ruby中最好的方法是什么?
例如,像这样的数组(非常普遍,我相信):
 weather = [{city: 'toronto', weather: :rain}, {city: 'montreal', weather: :storms}, {city: 'london', weather: :fog}, {city: 'paris', weather: :sun}, {city: 'boston', weather: :fog}, {city: 'vancounver', weather: :snow}]

到目前为止,我找到的最好的是:
weather.collect {|w| w[:city] if w[:weather] == :fog }.compact

但是在这种情况下,我必须调用compact来删除nil值,并且示例本身并不像Erlang那样易读。

更重要的是,在Erlang示例中,cityweather都是原子。我甚至不知道如何在Ruby中获得类似这样有意义且美观的东西。


这是一个关于编程的常见问题: https://dev59.com/5mgu5IYBdhLWcg3wbWo9,https://dev59.com/0XVC5IYBdhLWcg3wZwFT,https://dev59.com/4mkw5IYBdhLWcg3wqMQ0。 - tokland
1
Erlang非常声明式和符号化,非常接近人类。 - Muzaaya Joshua
1个回答

10

首先,你的数据结构并不相同。与你的 Erlang 示例等效的 Ruby 数据结构更类似于:

weather = [[:toronto, :rain], [:montreal, :storms], [:london, :fog], 
            [:paris, :sun], [:boston, :fog], [:vancouver, :snow]]

其次,是的,Ruby没有列表推导式和模式匹配。因此,这个例子可能会更加复杂。你的列表推导首先过滤了所有有雾的城市,然后选择了名称。让我们在Ruby中做同样的事情:

weather.select {|_, weather| weather == :fog }.map(&:first)
# => [:london, :boston]

然而,Ruby 是面向对象的语言,但是你正在使用抽象数据类型。如果采用更面向对象的数据抽象方式,代码可能看起来更像:

weather.select(&:foggy?).map(&:city)

这还不错,是吧?


Erlang元组与Ruby哈希不等同? - caarlos0
1
关于编程的内容,请将以下文本从英语翻译成中文。仅返回翻译后的文本:有关对象的部分加1分。直接翻译通常不是惯用的翻译方式。 - Mark Thomas
1
不,Erlang的dict相当于Ruby的Hash。在Ruby中,真正等同于元组的东西是不存在的,你只能用数组来最接近地模拟。 - Jörg W Mittag
1
@caarlos0 不要被花括号语法迷惑:元组不是与哈希相同的数据类型。 - Mark Thomas
嗯,明白了..我还没看到字典,我刚开始学 :) 感谢简单的解释。 - caarlos0

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