Ruby

雇佣 排名前3% of 自由Ruby开发人员

PT视讯是顶级Ruby开发者的市场, 工程师, 程序员, 程序员, 架构师, 和顾问. 顶级公司和初创企业选择PT视讯 Ruby自由职业者来完成关键任务的软件开发项目.

无风险试验,满意才付款.

客户的速度 PT视讯 Ruby开发人员4.4 / 5.0截至2021年12月21日,平均有734条评论

被领先品牌和初创公司所信赖

雇佣自由Ruby开发人员和工程师

大卫梁

自由Ruby开发人员

美国2017年10月23日起成为PT视讯会员

David是一位拥有超过12年web开发经验的全栈工程师, 管理开发过程的所有方面. 他参与了50多个项目,解决了包括市场营销在内的各种行业的复杂商业问题, 医疗保健, 电子商务, 房地产, 和汽车保险. 大卫在增加利润的同时一直在节约成本. 他已经准备好利用自己的技能为你的收入带来指数级增长.

显示更多

克莱门斯舵

自由Ruby开发人员

奥地利2017年9月29日起

克莱门斯作为一名全栈web开发人员已经工作了超过15年. 他热衷于设计和制造高质量的产品. 他最喜欢做自由职业的地方就是有机会接触到各种各样的项目, 人, 和文化. 通过这种方式,他不断为下一个项目积累经验和知识.

显示更多

Duarte戴安娜

自由Ruby开发人员

葡萄牙2016年12月23日成为PT视讯会员

Duarte是一个资深的开发人员,有超过十年的经验构建web应用程序, 使用rails和react. 他管理过工程团队,但仍然热爱编码. 无论是从零开始构建产品,还是整合现有团队, 他从第一天起就会很有效率.

显示更多

布鲁诺•科斯塔

自由Ruby开发人员

葡萄牙2019年9月15日起成为PT视讯会员

Bruno是一名拥有工程背景并对产品方面充满激情的全栈开发者. 在启动环境中工作, 他积累了丰富的经验,身兼多职,并成功地扮演了几乎每一个角色. Bruno目前正在指导网站Exercism上的Ruby轨道.io. 当描述布鲁诺时,我脑海中浮现出一些词:自信、无情和乐观.

显示更多

带着阿卜杜勒

自由Ruby开发人员

联合王国2019年9月12日起成为PT视讯会员

Fayaz是一名DevOps工程师和架构师,拥有端到端解决方案设计经验. 他拥有丰富的云计算和基础设施专业知识,并获得AWS的多项认证, Azure, 和谷歌云. 他专门研究监控工具(ELK, Zabbix, Prome的us)和Python自动化, Ansible, 起程拓殖, 和码头工人. 他实现了要构建的Jenkins CI/CD管道, 测试, 部署包括微服务在内的大型应用程序,实现零停机. 

显示更多

Ciprian Trușcă

自由Ruby开发人员

罗马尼亚2019年7月12日起成为PT视讯会员

Ciprian非常喜欢编码,他在不同的领域积累了丰富的经验. 他认为你懂的编程语言越多,你就会成为更好的程序员. 他的专长是安全性和高并发后端系统,但他也喜欢做前端, DevOps, 和自动化测试. 西普里安喜欢认真对待自己的责任,所以每一项任务都尽可能以最好的方式完成

显示更多

罗德里戈Souto

自由Ruby开发人员

巴西2019年8月6日起成为PT视讯会员

罗德里戈是一名活跃的软件开发人员,过去几年主要致力于开发复杂的网络应用程序. 他是一个使用前端的全能开发者, 后端, 在与各种规模的团队合作时使用基础设施技术. 同时对编码和解决问题充满热情,并致力于沟通和组织, 罗德里戈重视产品质量, 透明度, 敏捷开发, 和客户满意度.

显示更多

Arnaud Mesureur

自由Ruby开发人员

法国2019年8月22日起成为PT视讯会员

Arnaud在构建可伸缩和健壮的web应用程序方面有着丰富的经验,能够在不断发展和快节奏的环境中解决具有挑战性的问题. 他的经验包括创建一个高端的网络性能分析平台,以及一个独特的在线商业市场的工程主管,该市场每天有成千上万的用户访问,并产生数百万的收入.

显示更多

彼得亚雷Pałka

自由Ruby开发人员

波兰2017年9月11日起成为PT视讯会员

Piotr是一位经验丰富的全栈软件工程师和IT顾问, 了解客户的观点, 并将创意转化为高质量的产品. 他在企业和创业环境方面都有专长. 在大公司工作过, 银行, 和软件公司, Piotr开发了全球使用的产品,并利用各种技术堆栈帮助初创企业和内部企业系统.

显示更多

丹尼尔Araujo

自由Ruby开发人员

葡萄牙2017年10月25日起成为PT视讯会员

Daniel是一名在开发大型网络产品方面有丰富经验的工程师. 他是测试驱动开发的倡导者和可靠的爱好者, 高度可伸缩, 高性能软件解决方案. 作为一个人和开发者, 丹尼尔是自我激励, 渴望学习, 并乐于合作并提供解决方案.

显示更多

若昂·达·席尔瓦·费尔南德斯

自由Ruby开发人员

葡萄牙2019年7月16日起

João是一个专注于Ruby on Rails的全栈开发人员, 谁也在研究前端(最近用了反应)和基础设施. 他的职业生涯始于创业环境,直到2017年他加入Xing, 德国最活跃的专业网络平台. João通过代码质量和适当的交付过程来实现长期的可维护性, 代码评审, 并且提交历史是优先的.

显示更多

现在就注册看看更多的资料.

开始招聘

招聘指南

雇佣优秀Ruby开发人员指南

Ruby语言的设计从一开始就有一个清晰的理念:开源语言应该让程序员高兴. 其结果是一种独特的语言,充满了古怪的语法和语义,有时看起来有点神奇. 而Ruby经常被构建在它之上的某个web框架所掩盖, 该语言本身是通用的,非常适合各种各样的应用程序. 本指南中提出的问题可以非常有效地评估开发人员对Ruby语言的知识的广度和深度.

阅读招聘指南

Ruby招聘资源

雇佣Ruby开发人员的更多资源

工作描述模板

面试问题

技巧和实践

工作

Trustpilot
媒体报道

... 允许公司快速组建具有特定项目所需技能的团队.

尽管对编码员的需求不断增长,PT视讯却以其几乎达到常春藤盟校(Ivy league)水平的审核而自豪.

我们的客户
创建一个跨平台应用,供全世界使用
蒂埃里Jakicevic
创建一个跨平台应用,供全世界使用
奖状
<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

如果没有PT视讯, Tripcents就不会存在. PT视讯 Projects让我们的基金会在产品经理的帮助下快速发展, 带领开发人员, 和高级设计师. 在60多天的时间里,我们从概念到Alpha. 它的速度、知识、专业技能和灵活性是首屈一指的. PT视讯团队和其他内部团队成员一样,都是tripcents的一部分. 他们和其他人一样为开发做出了贡献并获得了所有权. 我们将继续使用PT视讯. 作为一个创业公司,它们是我们的秘密武器.

首席执行官Brantley步伐 & 联合创始人

Tripcents

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

我对PT视讯的经验非常满意. 和我一起工作的专业人士在几个小时内就和我通了电话. 在和他讨论了我的项目后,我知道他是我想要的候选人. 我立刻雇佣了他,他也立刻参与了我的项目, 甚至通过添加一些很棒的设计元素来增强我们的整体外观.

导演保罗•Fenley

K邓恩 & 的同事

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

与我搭档的开发人员都非常出色——聪明、有动力、反应灵敏. 过去很难找到高质量的工程师和顾问. 现在不是.

瑞安·洛克菲勒,首席执行官

Radeeus

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

PT视讯立即理解了我们的项目需要. 我们请来了一位来自阿根廷的优秀自由职业者, 从第一天起, 投身于我们的行业, 与我们的团队完美融合, 理解我们的愿景, 并产生了一流的结果. PT视讯使得与高级开发人员和程序员的联系非常容易.

Jason Kulik创始人之一

ProHatch

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

作为一家资源有限的小公司,我们不能犯代价高昂的错误. PT视讯为我们提供了一个经验丰富的程序员,他能够立即投入工作并开始贡献. 这是一个伟大的经历,我们会在心跳中再次重复.

斯图尔特·柏克尼校长

站点专用软件解决方案

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

我们通过PT视讯聘请了一位拥有丰富亚马逊网络服务经验的开发人员. 我们面试了四位候选人,其中一位非常符合我们的要求. 这一过程迅速而有效.

Abner Guzmán Rivera,首席技术官和首席科学家

照片Kharma

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

Sergio是一个非常棒的开发者. 一流,反应灵敏,工作效率高.

Dennis Baldwin,首席技术专家和联合创始人

PriceBlink

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

和Marcin一起工作是一种乐趣. 他是主管, 专业, 灵活的, 并且非常快地理解需要什么以及如何实现它.

Andre Fischer首席技术官

POSTIFY

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

我们需要一位专业的工程师,他能立即开始我们的项目. Simanas的工作超出了我们的预期. 不需要面试和寻找专业的开发人员是一个非常好的时间节省,并使每个人对我们选择转换平台以使用更健壮的语言感到更舒服. PT视讯让这个过程变得简单和方便. PT视讯现在是我们寻求专家水平帮助的第一个地方.

Derek Minor,网络开发高级副总裁

Networld传媒集团

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

PT视讯的开发人员和架构师都非常专业,也很容易共事. 他们所提供的解决方案价格合理且质量上乘,从而缩短了我们的发行时间. 再次感谢,PT视讯.

首席执行官杰里米鞋号

Kognosi

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

PT视讯给我们带来了很棒的体验. 他们为我们的应用程序匹配了完美的开发人员,使这个过程非常容易. 它也很容易超出最初的时间框架, 我们能够在整个项目中保持同一个承包商. 我们强烈推荐PT视讯快速无缝地寻找高质量人才.

瑞安莫首席技术官

应用商业技术有限公司

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

PT视讯给我留下了深刻印象. 我们的开发人员每天都和我交流,他是一个非常强大的程序员. 他是一个真正的专业人士,他的作品非常出色. PT视讯 5星.

首席执行官皮特Casoar

Ronin Play Pty Ltd

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

与PT视讯合作是一次很棒的经历. 使用它们之前, 我花了很长时间采访其他的自由职业者,却没有找到我需要的. 在与PT视讯接触后,他们在几天内就为我找到了一个完美的开发者. 与我一起工作的开发人员不仅交付高质量的代码, 但他也会对一些我没有想到的事情提出建议. 我很清楚阿莫里知道他在做什么. 强烈推荐!

首席执行官乔治•程

Bulavard公司.

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

作为一名合格的PT视讯前端开发人员,我还经营着自己的咨询业务. 当客户来找我帮忙填补他们团队中的关键角色时, PT视讯是我唯一放心推荐的地方. 托普塔尔的所有候选人都是精英中的精英. PT视讯是我在近五年的专业在线工作中发现的最物有所值的.

伊桑•布鲁克斯首席技术官

Langlotz专利 & 商标工作的公司.

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

在讨价还价早期, 我们需要一流的开发人员, 以可承受的利率, 及时地. PT视讯交付!

首席执行官劳拉Aldag

讨价还价

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

PT视讯让你非常容易找到一个候选人,并让你放心,他们有能力提供. 我肯定会向任何寻找高技能开发人员的人推荐他们的服务.

Michael Gluckman,数据经理

Mxit公司——

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

PT视讯能够迅速将我们的项目与最优秀的开发人员匹配起来. 开发人员已经成为我们团队的一部分, 我对他们每个人所表现出的敬业程度感到惊讶. 对于那些希望与最好的工程师远程工作的人来说,PT视讯是最好的选择.

创始人Laurent爱丽丝

Livepress

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

PT视讯让找到合格的工程师变得轻而易举. 我们需要一个有经验的ASP.NET MVC架构师来指导我们的初创应用程序的开发, PT视讯在不到一周的时间里就有了三个很好的候选人. 在我们做出选择后,工程师立即上线并开始工作. 这比我们自己发现和审查候选人要快得多,也容易得多.

联合创始人杰夫•凯利

协同解决方案

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

我们需要一些短期的Scala开发工作,PT视讯在24小时内就为我们找到了一个优秀的开发人员. 这是任何其他平台都不可能实现的.

弗兰科斯巴达,创始人之一

WhatAdsWork.com

<块quote class="_2ar9nUNS _2NETgTks _2O_uVeDU">

PT视讯为快速发展和规模化的企业提供了不妥协的解决方案. 我们通过PT视讯聘请的每一位工程师都迅速融入了我们的团队,在保持卓越开发速度的同时,他们的工作达到了最高的质量标准.

联合创始人格雷格•金博

nifti.com

如何通过PT视讯雇佣Ruby开发者

1

与我们的行业专家之一谈谈

PT视讯的工程总监将与您一起工作,以了解您的目标, 技术需求, 和团队动力.
2

与精心挑选的人才一起工作

几天之内,我们将为您的项目介绍合适的Ruby开发人员. 平均匹配时间在24小时以下.
3

合身,保证

与新的Ruby开发人员合作试用一段时间(如果满意就付费), 在订婚前确保他们是合适的人选.

常见问题

  • PT视讯 Ruby开发者有何不同?

    在PT视讯, 我们彻底筛选我们的Ruby开发人员,以确保我们只为您匹配最高水平的人才. 超过100个,每年有1万多人申请加入PT视讯网络, 只有不到3%的人能成功. 你将与工程专家(而不是一般化的招聘人员或人力资源代表)一起工作来理解你的目标, 技术需求, 和团队动力. 最终的结果是:专家从我们的网络中审查人才,定制匹配,以满足您的业务需求. 现在就开始.

  • 我可以通过PT视讯在48小时内雇佣Ruby开发人员吗?

    这取决于可用性和进度的快慢, 你可以在注册后48小时内开始与Ruby开发人员合作. 现在就开始.

  • PT视讯 Ruby开发者的无风险试用期是什么时候?

    我们确保你和你的Ruby开发者之间的每一次接触都有长达两周的试用期. 这意味着您有时间确认订婚是否成功. 如果你对结果完全满意的话, 我们将按时间向你收费,你们的婚约想继续多久就继续多久. 如果你不完全满意,你不会被收费. 从那里, 我们有两种选择, 或者我们可以为您提供另一位可能更适合的专家,我们将与他开始第二个, 无风险试用. 现在就开始.

分享
Ruby

如何雇佣优秀的Ruby开发人员

所面临的挑战

在他的书中 七周学七种语言, Bruce Tate将Ruby比作Mary Poppins:“她有时很古怪, 总是美丽的, 有点神秘, 和绝对神奇.“如果我们真的要选择一个角色来与这种语言进行比较的话, 我们很难做出更好的选择了. 的比较, 当然, 源于Ruby的设计理念:该语言应该让程序员高兴.

当David Heinemeier Hansson编写Basecamp的第一个版本并从项目中提取Ruby on Rails框架时,这种意识形态启发了他选择Ruby作为他的语言选择. 由于Ruby on Rails开发的成功,该语言变得流行起来, 经常会听到人们把“Ruby”和“Rails”当作同义词来误用, 或者错误地将Ruby归类为“网络语言”.”

有经验的ruby爱好者都知道, 该语言并不局限于web开发或web应用程序开发, 它几乎可以用于任何事情:编写原生智能手机应用程序或其他移动应用程序开发, 数据处理脚本, 或者作为一种教人们编程的工具.

尽管该语言的市场定位是对开发人员友好的, 它可以为来自其他语言的程序员提供一些惊喜, 因为它以意想不到的方式改变了许多熟悉概念的语义.

掌握Ruby有几个困难的原因,Rails的流行就是其中之一. 即, 许多开发人员刚学会了足够的Ruby来开始使用Rails,然后就停止了对这门语言的探索. 这要归功于Ruby神奇的输入模式, 这些RoR开发者很难理解什么是纯Ruby,什么是Rails内置的扩展. 考虑到Rails提供的许多扩展, 学习这门语言基本知识的动机减弱了.

额外的复杂性在于Ruby的多面性. 虽然它主要是一种面向对象的语言, 它还允许用函数式编程风格编写程序, 哪些方法可以提高代码的表现力和可读性. 这意味着Ruby提供了许多方法来完成一件事, 因此,“A类”Ruby程序员需要了解该语言的所有不同特性.

今天我们已经有了Ruby的多种实现,但这并没有帮助, 包括磁共振成像, JRuby, Rubinius, 和mruby. 因此, 做出正确的决定和判断, Ruby开发人员需要这样, 至少, 了解不同的实现, 以及他们的优势和劣势.

下面的指南为您提供了一些问题,以便在准备一场顶级Ruby开发人员的面试时获得灵感. 你不应该仅仅根据应聘者“正确”回答每个问题的能力来评估他们. 那就没有抓住重点, 因为并不是每一个优秀的候选人都知道这门语言的所有细节, 知道所有的细节也不能保证你是最好的开发人员. 而不是, 利用这些问题来了解候选人对手头问题的看法, 他们是如何解决难题的, 以及他们如何权衡选择并做出判断. 例如, 如果应聘者不知道答案, 问问他们如何得到它, 只要他们有一台能上网的电脑,并安装了Ruby解释器. 这本身就应该告诉你很多,甚至比正确答案本身还要多. 你也应该看看PT视讯发布在我们博客上的招聘指南: 寻找少数精英.

请注意,本指南关注的是纯Ruby. 如果你想雇佣全职或兼职的Ruby on Rails开发人员, 你也应该看看我们的 Ruby on Rails租用指南.

欢迎来到红宝石

将此部分视为讨论的热身:它将帮助您了解候选人是否编写过简单Rails应用程序以外的东西.

问:类和模块之间有什么区别? 有什么相似之处?

Ruby中的模块有两个用途:命名空间和mixin.

考虑一个处理带有感兴趣点的映射的应用程序. 两个开发这个应用程序的程序员可以想出两个不同的类,并给它们起相同的名字. 假设第一个创建了一个类 ,表示由定义的平面上的一个点 xy 坐标. 然后程序员在将地图呈现为图像时使用这个类. 其他程序员的 类在地图上建模感兴趣的点,并具有指定纬度的属性, 经度, 和描述.

当Ruby解释器发现多个类定义具有相同的名称时, 它假设程序员的目的是“重新打开”以前定义的类,并向以前的类添加新方法. 这可能会导致各种各样的问题, 所以最好将应用中不相关的部分放在不同的地方 名称空间 为了减少命名冲突的机会. 为了在Ruby中做到这一点,我们可以在不同的模块中放置不同的行为.g. 呈现地理:

模块呈现
  点=结构.新(:x, y)
结束

模块地理
  点=结构.新(lat,长,:描述)
结束

现在类的全名将更改为 呈现:点地理:点 所以不会有冲突.

当使用模块作为命名空间时,它们可以包括其他模块、类或方法. 晚些时候, 可以将模块包含在其他上下文中(不同的模块或类),这样就不需要完全拼写它们的名字了.

类可以包含模块, 其他类, 和方法, 但是不能像包含模块那样包含它们.

As mixin,模块通常将可以包含到其他类中的方法分组. 但是,我们不能创建模块的实例. 此外,一个模块不能扩展其他模块(但它可以包含它们).

类可以组合方法,它们可以被实例化,它们可以被其他类扩展.

在Ruby中,几乎所有东西都是对象,所以类和模块也是对象. Ruby中的每个类都是一个类型对象 Class,它扩展了一个名为 模块. 看看这个继承层次结构, 我们可以清楚地看到,模块只提供了类提供的特性的一个子集.

Q: Ruby如何查找要调用的方法?

理解和使用Ruby的全部功能需要程序员彻底理解对象在Ruby中的工作方式. 这不仅对像元编程这样的强大功能很重要, 同时也可以理解一些概念,这些概念一开始可能看起来很奇怪, 比如类方法的定义.

给出这段代码:

迈克=演员.new(first_的名字: 'Mike', last_的名字: 'Myers')
迈克.full_的名字

Ruby会在哪里寻找方法的定义呢 full_的名字?

Ruby查找方法的第一个地方是在对象自己的地方 元类 or eigenclass. 这个类支持每个单独的对象,并且包含在该对象上直接定义的方法, 与其他情况不同.

例如,下面的定义添加了一个方法 full_的名字 对象的元类 迈克:

def迈克.full_的名字
  “# {first_的名字} # {last_的名字}”
结束

因为元类是一个特定于这个对象的类,所以没有其他的类实例 演员 会有这种方法.

如果Ruby不能在对象的元类中找到方法,它将开始在 的祖先 对象的类(i.e. 的祖先 演员).

那么,类的祖先是什么呢? 我们可以让鲁比告诉我们!

演员.的祖先
# => [演员, Object, 内核, BasicObject]

我们可以看到Ruby中任何类的祖先列表都是从类本身开始的, 包括所有的祖先类(Object, “BasicObject”), 但也包含在继承层次中的任何类中的模块.g. 内核). 这是Ruby程序员应该理解的东西.

因为Ruby 2.0,由程序员决定将模块放在祖先列表的哪里.

让我们看两个例子. 我们假设这是Ruby版本2.0以上:

例1:包含 FullName 模块到类中 演员.

class 演员 < 人
  包括FullName
结束

如果我们现在查找类的祖先列表 演员,我们将看到模块 FullName 之间出现 演员 类:

演员.的祖先
# => [演员, FullName, 人, Object, 内核, BasicObject]

例2:前置 FullName 模块设置为类 演员.

class 演员 < 人
  预谋FullName
结束

通过将 FullName,我们已经告诉Ruby在祖先列表中将模块放在类本身之前:

演员.的祖先
# => [FullName, 演员, 人, Object, 内核, BasicObject]

如果Ruby搜索整个祖先列表,但不能根据给定的名称找到方法, Ruby会在内部向对象发送另一个消息(方法调用): 方法_missing?. 系统将重复查找此方法,并将至少在 Object 类(如果程序员在更早的祖先中定义了它,则更早)并执行它.

Q: Ruby支持多继承吗? 有必要吗?

像其他现代语言一样,Ruby只支持单一继承,这就是 作为特性引用 作者是语言的创造者松本幸弘.

Ruby不需要支持多继承, 因为所有可以用它完成的事情都可以通过duck-typing和模块(i.e.mixin).

因为Ruby是一种动态类型语言, 为了让程序运行,对象不需要是特定类型. 而不是, Ruby利用duck-typing:如果对象像duck一样嘎嘎叫, 像鸭子一样走路, 它是一只鸭子. 也就是说,我们可以询问任何对象是否知道如何响应消息. 或者,我们可以简单地发送一条消息,并相信对象能够处理它.

多重继承的另一个用途是在不能建模为链的不同类之间共享代码. 为了实现这一, 我们可以将想要共享的代码作为一个模块中的方法编写,并在需要时将其包含到其他类中. 允许将方法分组并包含在多个类中的概念是mixin的定义.

我们应该注意,将模块包含到类中会将其添加到类的祖先列表中:

class 演员 < 人
  包括FullName
结束

演员.的祖先
# => [演员, FullName, 人, Object, 内核, BasicObject]

也就是说一旦模块被混合进去了, 来自超类的方法之间没有区别, 还有那些来自mixin的.

Q:给出下面的类声明,找出一个bug并提供一个解决方案.

类工作
  . attr_reader:数据

  def初始化(d)
    data = d
  结束

  def的电话
    #创建一个需要@ data的进程
  结束

  私人

  def data = (d)
    @ data =清洁(d)
  结束

  def清洁(d)
    #返回已消毒的数据
  结束
结束

问题在于 初始化 方法,该方法尝试赋值参数 d 使用私有属性写入器 data =. 然而,setter不会被调用,因为Ruby会处理 data = d 作为局部变量的初始化. 当Ruby遇到赋值操作符左侧以小写字符或下划线开头的标识符时, Ruby将创建并初始化一个局部变量. 请注意,这种行为与Ruby在其他上下文中处理相同标识符的方式不一致:如果标识符没有引用已定义的局部变量, Ruby将尝试调用一个具有给定名称的方法.

为了明确,我们需要调用writer方法(i.e. 以结束的方法 = 字符),我们需要在名称前加上 自我:

def初始化(d)
  自我.data = d
结束

这似乎是违反直觉的, 假定私有方法不能用显式的接收者调用(即使它是 自我). 然而,该规则也有一个例外:私有写入器方法(i.e.,以 =)可以用 自我.

修复该bug的另一种方法是直接将该值赋给实例变量 @ data 在初始化:

def初始化(d)
  @ data =清洁(d)
结束

经验丰富的Ruby爱好者,或者学习Ruby的经验丰富的程序员?

从其他编程语言接触Ruby的人可以看到一个熟悉的特性,并假定它在Ruby中也以同样的方式工作. 不幸的是, 但事实并非总是如此, Ruby中的一些概念可能会让有其他语言经验的开发人员感到惊讶. 下面的问题旨在区分有经验的Ruby爱好者和盲目遵循熟悉概念并将其应用于Ruby的人.

问:请解释两者之间的区别 /提高/救援 在Ruby中.

和大多数现代面向对象编程语言一样, Ruby有一种机制来通知异常情况,并在其他代码块中处理这些异常. 为了发出错误信号,Ruby程序员会使用 提高 方法, 哪个中止当前代码块的执行并展开调用堆栈查找 救援 语句,该语句可以处理引发的异常.

从这个意义上说 提高 方法执行与 声明在c++和受它启发的语言中做的,然而 救援 对应于 块. 这些操作应该用于发出异常状态信号并对其进行处理, 它们不应该用于正常的流量控制.

然而,Ruby也有 方法,可能会让新手失去平衡,因为它们 用于流量控制,并且应该 用于错误处理.

你可以想到 作为GOTO声明 作为设置标签的方法. 然而,与传统的GOTO(可以跳转到程序中的任何其他点)不同, 只能在室内使用 Block,我们马上就会演示.

理解语法差异很重要: 救援 是一个关键字,而不是我们可以重写的方法(提高 是一种方法). 我们可以合并多个 救援 语句来处理不同类型的错误,我们总是把 救援 关键字在可能会引发异常的块之后.

例如:

开始
  HTTP响应= Net::.得到(uri)
救援超时:错误
  输入"已超时,请稍后再试。."
救援Net:: HTTPBadResponse
  puts "服务器返回了一个格式不正确的响应."
救援
  表示“发生了未知错误。."
结束

另一方面, 是接受两个参数的方法:可以捕获的符号(“标签”), 还有一个我们可以使用的块 . 的 方法也可以接受两个参数:第一个是强制性的, 并且应该是一个与 label to which 的 program should jump; 的 second is optional 和 will become 的 return value of 的 声明. 的 / 当需要跳出嵌套循环时,Pair可能很有用, 就像这个寻找免费产品的例子:

Free_product = 抓(:found)做
  商店.每个做| |商店
    商店.产品.每个产品做| |
      如果产品.免费的?
        抛出:发现,产品
      结束
    结束
  结束
结束

如果免费的_product
  放置“找到一个免费产品:#{免费的_product}”!"
结束

问:布尔值之间有区别吗 &&/|| 运算符和编写的版本 /or?

这两者之间肯定有很大的不同. 尽管 && (or or||)在语义上是相等的(两者都是短路布尔运算符), 它们有不同的运算符优先级.

英国的运营商 or 优先级很小. 事实上,它们的优先级低于大多数其他Ruby操作符,包括赋值操作符 =.

考虑到这些算子是 Python中的布尔运算符, 老练的python爱好者可能会在Ruby中误用它们, 哪些可能会产生意想不到的逻辑错误. 考虑一下这个习惯用法,它经常用于访问一个可能没有初始化的对象的属性:

演员.new(first_的名字: 'Mike', last_的名字: 'Myers')]
的名字 =演员[0] && 演员[0].的名字
# => "Mike"
把名字
# => Mike

如果 演员 数组为空,或包含 作为第一个元素,布尔语句将立即解析为该值,而 的名字 变量会 . 但是,如果数组的第一个元素为真,我们将发送该消息 的名字 ,并将结果赋值给变量 的名字.

然而,如果我们使用英文版本的操作符,我们会得到不同的结果:

演员.new(first_的名字: 'Mike', last_的名字: 'Myers')]
Name =演员[0]和演员[0].的名字
# => "Mike"
把名字
# => #<演员:0x007fa07a1b4a00>

我们可以看到,第二行表达式的结果和最后赋给变量的值是不同的. 因为 = 结合更严格的比 ,操作数首先围绕赋值分组,然后才围绕 操作符. 我们可以用括号来说明:

(的名字 =演员[0])和演员[0].的名字

在语言中使用这两个操作符的原因是允许使用 or 作为Perl风格的控制流命令.

Q:下面给出的是一个代码片段,计算在所有商店中有30%或更多折扣的所有产品的总折扣价值. 如果我们假设,使用基本的函数操作(map/filter/减少/flatten/compact)重写这段代码 商店 的数组 商店 对象加载到内存中,其中每个 商店 引用列表 产品 在内存. 您将在生产就绪的代码中保留哪个版本?

总计_discount = 0

商店.每个做| |商店
  商店.产品.每个产品做| |
    如果产品.discount >= 0.3
      总计_discount + =产品.*产品折扣.价格
    结束
  结束
结束

因为我们希望将列表转换为单个值,所以这似乎是 减少 方法(或 注入,的别名 减少):

总计_折扣=商店.减少(0){|总数,商店|
  总+店.产品.Reduce (0) {|小计, product|
    如果产品.discount >= 0.3
      小计+产品.*产品折扣.价格
    其他的
      小计
    结束
  }
}

整个计算现在是一个表达式,不需要在单独的行中初始化累加器变量.

但是,这种方法可能有点难以阅读,因为我们已经嵌套了 减少 操作. 为了简化代码, 我们可以先创建一个所有产品的列表,然后通过链式操作来减少它:

总计_discount =商店.
  Flat_map {|s| s.产品}.
  减少(0){|总计, product|
    如果产品.discount >= 0.3
      总+产品.*产品折扣.价格
    其他的
      总计
    结束
  }

如果我们愿意牺牲一些性能,将不同类型的操作分割成不同的块,就有可能进一步提高可读性:

总计_discount =商店.
  Flat_map {|s| s.产品}.
  选择{|p| p.discount >= 0.3 }.
  Map {|p| p.折扣* p.价格}.
  减少(0){|sum, d| sum + d}

需要强调的是,我们已经通过这个更改阻碍了性能:新代码将在相同的产品列表中迭代多次. 如果此代码不在性能关键路径中, 这种下降可以通过可读性的提高来证明.

从算法上讲, 这两种操作在时间上都是线性的, 对于很多产品来说, 代码的风格可能不是至关重要的.

另一方面, 我们已经获得了以声明方式列出处理初始列表步骤的代码, 类似于SQL查询.

Ruby专家应该知道如何推断出改变的原因, 测量两个解决方案的性能,并做出与上下文相关的决策. 你的目标不应该是等待“正确”的答案, 而是去听程序员,看看他或她是如何判断各种选择的.

问:这两者有什么区别 公共, 受保护的私人 Ruby中的可见性?

方法可见性说明符经常会给那些几乎熟悉任何其他OOP语言的Ruby新手造成困扰.

公共可见性是Ruby的默认值,它的行为就像在任何其他语言中一样. 任何可以访问该方法的对象的对象都可以调用公共方法.

然而, 私人 可见性是不同的. 在Ruby中, 私人 方法只能在不显式指定消息接收者的情况下被直接调用.

请考虑查找的实现 n第th斐波那契数列的记忆递归:

类MemoizedFibonacci
  def初始化
    @memo = {}
  结束

  def得到(n)
    @memo [n] | | =计算(n)
  结束

  私人

  def计算(n)
    return 1 if n <= 1
    获得(n - 1) + (2)
  结束
结束

我们有一个公共方法 得到 还有一个私有方法 计算. 公共方法首先通过在 @memo 哈希. 如果不是,它会调用 计算 方法并将结果存储到散列中.

让我们试着稍微修改一下 得到 方法:

def得到(n)
  @memo [n] | | =自我.计算(n)
结束

新来的人知道 自我 在Ruby中等价于 在像c++, c#和Java这样的语言中,所以他们被引导去相信这个改变不会有任何影响. 然而,我们现在已经添加了显式接收器, 自我,致讯息 计算. 因为Ruby要求 私人 方法在没有显式接收方的情况下被调用,这将产生错误!

该规则的另一个意想不到的副作用是,私有方法可以从子类中调用. 事实上,在Ruby中,我们认为“关键字”的很多东西只不过是模块中的私有方法 内核,包括在 Object 类,因此被每个Ruby对象继承. 例如,当我们使用 提高,我们实际上调用了一个超类的私有方法!

Ruby是一种开放的语言, 所以它甚至不允许开发商锁住他们的私处, 可以这么说.

这叶子 受保护的 可见性. 它像 公共, 但有一个例外:受保护的方法只能从同一类或其任何子类的方法中调用. 你会注意到,在这个意义上, 受保护的 的类似方式 私人 其他语言的可见性. 这意味着 受保护的 方法可见性应该在想要隐藏其状态的类中使用, 但允许从类中需要它的其他方法调用该方法来生成副本或实现比较.

大局

问:举出至少三种不同的Ruby实现. 讨论它们之间的差异.

调用标准的Ruby实现 核磁共振成像 (Matz 's Ruby Interpreter的简称)或者 成为CRuby. 顾名思义,它是由松本幸弘(Yukihiro Matz)用C语言写成的. 是作者对Ruby的主要实现, 它和语言一起成长,这不足为奇. 即使该语言有ISO规范(ISO / IEC 30170:2012),该规范在Ruby 2发布时就已经过时了.0. 因此, 所有新的语言特征将首先出现在核磁共振成像中, 然后它们可能会在其他解释器中实现. 由于用C编写,核磁共振成像可以与其他C代码互操作,也可以运行用C编写的gems.

这个实现最常提到的问题之一是缺乏对真正并行化的支持, 因为核磁共振成像 Ruby只支持绿色线程,并且依赖于全局解释器锁(吉尔).

Rubinius 另一个实现是否基于 LLVM,用c++和Ruby编写. 它通过使用本机线程和即时(JIT)编译器改进了并发性. 另外, 核心库大部分是用Ruby本身编写的, 更容易理解内部结构, 尤其是对那些不喜欢C的人来说.

核磁共振成像和语言之间的耦合使得Ruby的其他实现很难保持最新, 这意味着它们可能缺乏最近版本的核磁共振成像中发现的特征. Rubinius团队做的第一件事是 RubySpec: Ruby语言的可运行规范, 这将允许语言分支的开发人员根据“标准”来检查他们的实现。. 不幸的是,这个项目最近被它的创造者终止了 并没有在Ruby社区中提供理想的结果.

请注意Rubinius并不一定在其中 追赶 模式下的Ruby语言:版本3将添加Ruby本身没有计划的特性, 包括功能, 渐进的打字, 和多个调度.

那些需要将Java代码与Ruby接口的人可能会发现 JRuby 有帮助的. 像Rubinius, 它通过依赖本机线程提供了改进的并发选项, 和JIT编译字节码到机器码. 作为奖励, 它提供了与现有Java虚拟机(JVM)代码的互操作性(您可以使用本机Java类和库),并提供了在任何JVM上运行Ruby的可能性.

由于JRuby依赖于JVM,这意味着它不能使用纯C编写的Ruby gems. 虽然这个实现可以提高运行时速度, 它引入了应用程序缓慢的启动时间.

另一个值得注意的实现是 mruby: Ruby ISO标准的一个可嵌入子集. 马茨本人正在领导它的发展, 目标是让Ruby能够作为一种嵌入式语言运行在现有的应用程序和游戏中, 提供脚本性和自动化, 从而挑战Lua.

你可以阅读更多关于其他Ruby实现的信息 我们关于Ruby解释器和运行时的博客文章.

总结

一个完美的Ruby开发人员不会盲目地优化代码,使其运行速度比以前快几毫秒,或者消耗的内存比以前少几兆. 完美的候选人, 在美国或国外, 当表现是至关重要的时候,你会知道如何做到这一点吗, 但是,如果它会牺牲太多的可读性和可维护性,那么将能够推荐替代方案. 但完美的候选人也不会为写得不好的算法辩护为“漂亮”。. 在Ruby中,人们可以说,完美在于妥协和良好的判断. 在和你的候选人谈话时,记住这一点,倾听他们的推理.

快乐的面试!

特色PT视讯 Ruby出版物

顶级Ruby开发人员需求量很大.

开始招聘