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

为什么Ruby人说他们不需要接口?

发布时间:2020-12-17 04:25:52 所属栏目:百科 来源:网络整理
导读:ruby与其他OOP语言有什么不同(例如: PHP)会使接口无用吗?它有什么替代品吗? 编辑: 一些澄清: 在其他语言(例如:PHP)中,您不需要“接口”(在代码级别它们不是必需的).您可以使用它们签订合同,以改进软件的架构.因此,肯定’在ruby中你不需要接口/在其他语
ruby与其他OOP语言有什么不同(例如: PHP)会使接口无用吗?它有什么替代品吗?

编辑:

一些澄清:

>在其他语言(例如:PHP)中,您不需要“接口”(在代码级别它们不是必需的).您可以使用它们签订合同,以改进软件的架构.因此,肯定’在ruby中你不需要接口/在其他语言中你需要接口,因为XXX’是错误的.
>不,mixins不是接口,它们是完全不同的东西(PHP 5.4实现mixins).你有没有使用过接口?
>是的,PHP是OOP.语言不断发展,欢迎来到现在.

解决方法

嗯,这是一个共识,当一个对象在Ruby中传递时,它不是经过类型检查的. Java和PHP中的接口是一种确认对象符合某个契约或“类型”的方式(因此某些东西可能是Serializable,Authorizable,Sequential以及您想要的任何其他内容).

但是,在Ruby中,没有形式化的合同概念,接口将履行一些有意义的角色,因为在方法签名中不检查接口一致性.例如,参见Enumerable.当您将其混合到对象中时,您正在使用其功能,而不是声明您的对象是可枚举的.让你的对象成为可枚举的唯一好处就是定义了每个(& blk)你自动获得地图,选择和朋友免费.你可以完美地拥有一个实现Enumerable提供的所有方法的对象,但是它不会在模块中混合,它仍然可以工作.

例如,对于Ruby中需要IO对象的任何方法,您可以提供与IO无关的内容,然后它会因错误而爆炸,或者 – 如果您正确实现了IO存根 – 它将正常工作即使您传递的对象未被声明为“IO-ish”.

这背后的想法来自这样一个事实:Ruby中的对象并没有真正美化的哈希表,并且标签被打到它们上(然后有一些额外的标签告诉解释器或编译器这个对象有接口X因此它可以用于上下文Y)但是一个响应消息的封闭实体.因此,如果一个对象响应一个特定的消息,它将完成合同,如果它没有响应该消息 – 那么就会出现错误.

因此缺少接口可以部分地通过模块的存在来补偿(模块可以包含您在不对呼叫者/消费者做出任何类型承诺的情况下达到的功能),部分地由消息传递的传统而不是类型化的dicts来补偿.

你应该观看Jim Weirich的一些演讲,因为他广泛接触这个主题.

(编辑:李大同)

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

    推荐文章
      热点阅读