加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Erlang vs Ruby列表理解

发布时间:2020-12-17 03:54:35 所属栏目:百科 来源:网络整理
导读:我刚开始学习Erlang,并且非常喜欢他们的列表理解语法,例如: Weather = [{toronto,rain},{montreal,storms},{london,fog},{paris,sun},{boston,{vancounver,snow}]. FoggyPlaces = [X || {X,fog} - Weather]. 在这种情况下,FoggyPlaces将评估为“伦敦”和“
我刚开始学习Erlang,并且非常喜欢他们的列表理解语法,例如:

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

在这种情况下,FoggyPlaces将评估为“伦敦”和“波士顿”.

在Ruby中执行此操作的最佳方法是什么?

例如,像一个数组(很常见,我相信):

weather = [{city: 'toronto',weather: :rain},{city: 'montreal',weather: :storms},{city: 'london',weather: :fog},{city: 'paris',weather: :sun},{city: 'boston',{city: 'vancounver',weather: :snow}]

我现在最好的是:

weather.collect {|w| w[:city] if w[:weather] == :fog }.compact

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

而且,在Erlang的例子中,城市和天气都是原子.我甚至不知道如何在Ruby中获得有意义且看起来很好的东西.

解决方法

首先,您的数据结构不相同.与Erlang示例等效的Ruby数据结构更像是

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

其次,是的,Ruby没有列表推导或模式匹配.所以,这个例子可能会更复杂.您的列表理解首先过滤所有模糊的城市,然后预测名称.让我们在Ruby中做同样的事情:

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

但是,Ruby以对象为中心,但您使用的是抽象数据类型.通过更加面向对象的数据抽象,代码可能看起来更像

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

这不是太糟糕,是吗?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读