红宝石

雇用 Top 3%自由红宝石开发商

Toptal.是银河游戏官方首页开发人员,工程师,程序员,编码器,建筑师和顾问的市场。顶级公司和初创公司选择Toptal 银河游戏官方首页 Freelancer进行关键任务软件开发项目。

无风险审判,仅在满意时付款。

客户率 Toptal. 银河游戏官方首页 Developers4.4 / 5.0平均超过691份截至2010年3月27日

通过领先的品牌和初创公司信任

租用自由职业者红宝石开发人员和工程师

大卫梁

自由红宝石开发人员

美国Toptal. Member Since October 23, 2017

David是一名全堆栈工程师,拥有超过12年的Web开发经验,管理开发过程的各个方面。他'S在50多个项目工作,并解决了各种行业的复杂业务问题,包括营销,医疗保健,电子商务,房地产和汽车保险。大卫在增加利润时一直节省成本。他'准备好机会使用他的技能指数增长您的收入。

展示更多

克莱蒙舵

自由红宝石开发人员

奥地利Toptal. Member Since September 29, 2017

克莱森一直在一年多的全堆叠Web开发人员工作。他'对设计和建造高质量产品的热情。他最喜欢自由职业者的爱是有机会遇到各种类型的项目,人民和文化。通过这种方式工作,他不断获得他的下一个项目的经验和知识。

展示更多

Duarte Henriques.

自由红宝石开发人员

葡萄牙Toptal. Member Since December 23, 2016

Duarte是一位高级开发人员,拥有超过十年的建筑Web应用程序,使用Rails并反应。他有管理的工程团队,但仍然喜欢编码。无论是从头开始或整合现有团队的建立产品,他将从第一天富有成效。

展示更多

布鲁诺哥斯达

自由红宝石开发人员

葡萄牙Toptal. Member Since September 15, 2019

Bruno是一个全堆叠开发人员,其中包括工程背景和对产品侧的大量热情。在启动环境中工作,他已经积累了丰富的经验,穿着许多帽子,并成功地履行几乎所有作用。 Bruno目前正在努力在网站excietism.io上指导银河游戏官方首页曲目。在描述布鲁诺时想到的一些话语是自信,无情和乐观的。

展示更多

Fayaz Abdul.

自由红宝石开发人员

英国Toptal. Member Since September 12, 2019

Fayaz是一个Devops工程师和建筑师,具有设计端到端解决方案的经验。他拥有广泛的云和基础设施专业知识,在AWS,Azure和Google Cloud中具有多种认证。他专注于用Python,Ansible,Terraform和Docker监控工具(麋鹿,Zabbix,Prometheus)和自动化。他'S实现了Jenkins CI / CD管道,建立,测试和部署大型应用程序,包括具有零停机的微服务。 

展示更多

CiprianTruşcă.

自由红宝石开发人员

罗马尼亚Toptal. Member Since July 12, 2019

Ciprian喜欢编码很多,他在不同的域名收集了大量的经验。他认为你所知道的编程语言越多,你是更好的程序员。他的专业是安全和高度同时的后端系统,但他也喜欢前端,DevOps和自动化测试。克里普里安喜欢认真对待他的责任,以便尽可能最好的方式完成

展示更多

Rodrigo Souto.

自由红宝石开发人员

巴西Toptal. Member Since August 6, 2019

Rodrigo是一个活跃的软件开发人员'在过去的几年里,主要是建立复杂的网络应用程序。他是一系列的开发人员,他们使用前端,后端和基础设施技术,同时与各种尺寸的团队合作。随着对编码和解决问题的热情,强烈致力于通信和组织,Rodrigo重视产品质量,透明度,敏捷开发和客户满意度。

展示更多

Arnaud Mesureur.

自由红宝石开发人员

澳大利亚Toptal. Member Since August 22, 2019

Arnaud在不断发展和快节奏的环境中解决了挑战问题的可扩展和强大的Web应用程序的经过验证的轨道记录。他的经验范围从创造一个高端网络性能分析平台,作为每天几以时数万人参观的独特在线商业市场的负责人,并在收入中产生数百万。

展示更多

piotrpałka.

自由红宝石开发人员

波兰Toptal. Member Since September 11, 2017

Piotr是一个经验丰富的全堆栈软件工程师和IT顾问,他理解客户的观点,并将思想变成高质量的产品。他在企业和启动环境中拥有专业知识。 Piotr在公司,银行和软件房屋工作,Piotr开发了全球使用的产品,并使用各种技术堆栈帮助启动和内部企业系统。

展示更多

Daniel Araujo.

自由红宝石开发人员

葡萄牙Toptal. Member Since October 25, 2017

丹尼尔是一名在大型网上产品开发中经历的工程师。他是一个可靠,高度可扩展和表演软件解决方案的测试驱动的开发倡导者和情人。作为一个人和开发者,丹尼尔是自我激励的,渴望学习,很乐意协作和提供解决方案。

展示更多

joao da silva fernandes

自由红宝石开发人员

葡萄牙Toptal. Member Since July 16, 2019

João是一个专注于银河游戏官方首页在Rails上的全堆叠开发人员,他也涉及前端(最近反应)和基础设施。他在2017年加入兴业时期,他的职业生涯主要在启动环境中工作,直到2017年加入繁茂,德国 'S最活跃的专业网络平台。 João通过代码质量和经过测试,代码审查和提交历史记录的正确交付过程努力实现长期可维护性。

展示更多

立即注册以查看更多档案。

开始招聘

招聘指南

聘请伟大的银河游戏官方首页开发人员指南

红宝石语言是从一个开头设计的,明确的哲学:开放源语言应该让程序员开心。结果是一种充满古怪语法和语义的唯一语言,有时似乎有点神奇。虽然银河游戏官方首页经常被建立在其顶部的某个Web框架的镜头,但语言本身是多么多样化,适合各种应用。本指南中提出的问题可以在评估开发人员的广度和深度方面非常有效'我们了解银河游戏官方首页语言。

阅读招聘指南

红宝石招聘资源

更多资源来雇用红宝石开发人员

职位描述模板

面试问题

提示和实践

职位

TrustPilot.
Toptal. in the press

...允许公司快速组装具有特定项目的合适技能的团队。

尽管对编码人员的需求加速了,Toptaltal旨在自行为几乎常春藤联盟级审查。

我们的客户
构建一个全球使用的跨平台应用程序
Thierry Jakicevic.
构建一个全球使用的跨平台应用程序
1
2
3
为游戏创建一个应用程序
Conor Kenney.
为游戏创建一个应用程序
1
2
3
领导数字转型
Elmar Platzer.
领导数字转型
1
2
3
推荐书

三普国不会'T存在没有顶尖。顶部项目使我们能够用产品经理,铅开发商和高级设计师迅速发展我们的基础。在60多天内,我们从概念到阿尔法。速度,知识,专业知识和灵活性是秒数。 Toptaltal团队作为三级队员的三级队员的一部分。他们贡献并就像其他人一样贡献并获得了发展的所有权。我们将继续使用TOPTAL。作为一个启动,他们是我们的秘密武器。

布兰特利步长,首席执行官& Co-Founder

三级

我对Toptaltal的经验非常满意。我必须与我一起工作的专业人士在几个小时内与我一起。我知道在与他讨论我的项目后,他是我想要的候选人。我立即雇了他,他浪费了浪费时间来到我的项目,甚至通过添加一些优秀的设计元素来加强额外的英里,以增强我们的整体外观。

Paul Fenley,导演

k dunn.& Associates

我与令人难以置信的 - 聪明,驱动和响应性的开发人员。它曾经很难找到优质的工程师和顾问。现在它是't.

Ryan Rockefeller,CEO

辐射群

Toptal.立即了解我们的项目。我们与阿根廷的特殊自由职业者与阿根廷,从第1天沉浸在我们的行业中,与我们的团队无缝混合,理解我们的愿景,并产生了顶级缺口结果。 Toptal与卓越的开发人员和程序员相连,非常容易。

Jason Kulik,联合创始人

PROHATCH.

作为一个有限资源的小公司,我们可以'不起赚得昂贵的错误。 Toptal为我们提供了一个经验丰富的程序员,他们能够击中地面运行并立即开始贡献。这是一个伟大的经历和我们'd再次在心跳中重复。

斯图尔特Pocknee,校长

站点特定的软件解决方案

我们使用Toptal聘请开发人员,具有广泛的亚马逊网络服务体验。我们采访了四名候选人,其中一个候选人竟然有适合我们的要求。该过程快速有效。

ABNERGUZMÁNVILLA,CTO和首席科学家

照片kharma.

Sergio是一个令人敬畏的开发人员。顶级陷波,响应,并有效地完成了工作。

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

PriceBlink.

与马林一起工作是一种快乐。他是有能力,专业,灵活的,非常快速地了解所需的内容以及如何实现它。

和réFischer,CTO

发布

我们需要一个专家工程师,他们可以立即启动我们的项目。辛巴纳斯与他的工作超出了我们的期望。不得不采访和追逐专家开发商是一个优秀的时光,让每个人都对我们的选择感到更加舒适,以改变平台来利用更强大的语言。 Toptog易于方便地制作了该过程。 Toptal现在是我们寻找专家级别帮助的第一名。

Web开发的高级VP德里克未成年人

Networld Media Group.

Toptal.'S开发人员和建筑师都非常专业,易于使用。他们生产的解决方案相当定价和最高品质,减少了推出的时间。再次感谢,Toptal。

Jeremy Wessels,CEO

Kognosi.

我们拥有Toptal的伟大体验。他们将我们与完美的开发人员配对,为我们的应用程序并使过程非常容易。它也很容易超出初始时间范围,我们能够在我们的项目中保持相同的承包商。我们绝对推荐顶尖,用于快速和无缝地找到高质量的人才。

Ryan Morrissey,CTO

应用业务技术,LLC

I'M Toptal令人难以置信地印象深刻。我们的开发人员每天与我沟通,是一个非常强大的编码器。他'真正的专业人士,他的工作很棒。顶部5星。

Pietro Casoar,CEO

Ronin Play Pty Ltd

与Toptal一起工作是一个很好的体验。在使用它们之前,我花了很长时间采访其他自由职业者和尚未'找到我需要的东西。与Toptal一起参与后,他们在几天内与完美的开发人员匹配。开发商I.'m不仅可以提供质量代码,而且他还提出了我达到的事情的建议't thought of. It'对我来说清楚,阿拉夫里知道他在做什么。强烈推荐!

乔治城,首席执行官

Buravard,Inc。

作为顶级合格的前端开发人员,我也运营了自己的咨询练习。当客户来找我来帮助填补他们的团队上的关键角色时,Toptal是我唯一舒适的推荐的地方。 Toptal.'整个候选池是最好的。 Toptal是我的最佳价值我'在近一年的专业在线工作中发现了。

Ethan Brooks,CTO

Langlotz专利&商标作品,Inc。

在嘻嘻哈哈 '早期,我们以及时的方式,我们需要一流的开发商,以实惠的价格。 Toptal送货!

Lara Aldag,CEO

h

Toptal.让候选人非常容易,让您能使他们有能使他们有能力提供。我肯定会向寻求高技能开发人员的人推荐他们的服务。

Michael Gluckman,数据经理

mxit.

Toptal.迅速匹配我们的项目与最佳开发人员的能力只是一流的。开发商已成为我们团队的一部分,我对他们中的每一个都证明了专业承诺的水平。对于那些希望远程工作的人与最好的工程师来说,看起来不仅仅是Toptaltal。

Laurent Alis,创始人

临身

Toptal.让找到合格的工程师微风。我们需要经验丰富的ASP.NET MVC架构师来指导我们的启动应用程序的开发,并在不到一周内为我们提供三位伟大的候选人。在我们选择后,工程师立即在线并击中地面运行。它比我们自己发现和兽医候选人更快和更容易。

杰夫凯利,联合创始人

协调解决方案

我们需要在Scala中的一些短期工作,Toptal在24小时内发现了我们一个伟大的开发人员。这不仅仅是通过任何其他平台都无法实现。

Franco Arda,联合创始人

whatadswork.com.

Toptal.为正在进行快速发展和规模的企业提供禁令解决方案。每个工程师我们'通过Toptal签约已经很快集成到我们的团队中,并将其工作持有最高标准的质量,同时保持炽热的发展速度。

Greg Kimball,联合创始人

nifti.com.

如何通过Toptal雇用红宝石开发人员

1

与我们的行业专家交谈

Tophteal Engineering主任将与您合作,了解您的目标,技术需求和团队动态。
2

与手工选择的人才合作

在几天内,我们'LL向您介绍您的项目右边的银河游戏官方首页开发人员。平均匹配时间在24小时内。
3

右边合身,保证

与您的新银河游戏官方首页开发人员合作进行试用期(仅在满意时付款),确保他们'在开始参与之前,右边适合。

常见问题解答

  • Toptal 银河游戏官方首页开发人员如何不同?

    在Toptal,我们彻底屏蔽了我们的银河游戏官方首页开发人员,以确保我们与最高口径的人才相匹配。每年申请加入Toptal Network的100,000多人,削减少于3%。您将与工程专家(从不泛化招聘人员或人力资源代表)合作,了解您的目标,技术需求和团队动态。最终结果:来自我们网络的专家审计人才,习惯符合您的业务需求。 现在开始。

  • 我可以雇用红宝石开发人员在不到48小时内到Toptalal吗?

    根据可用性以及您可以进行的速度,您可以在注册的48小时内开始使用银河游戏官方首页开发人员。 现在开始。

  • Toptal 银河游戏官方首页开发人员的无风险试用期是多少?

    我们确保您和您的银河游戏官方首页开发人员之间的每次参与开始于最多两周的试用期。这意味着您有时间确认订婚将是成功的。如果您对结果完全满意,我们会为您收取时间并继续接触,只要您想要。如果你没有完全满意,你将不会收取费用。从那里,我们可以通过部分方式,或者我们可以为您提供可能更适合的另一个专家,并与我们将开始第二名,无风险的审判。 现在开始。

分享
红宝石

如何聘请伟大的银河游戏官方首页开发人员

挑战

在他的书中 七周内七种语言,布鲁斯·泰特比较红宝石对玛丽的人口:“她有时古怪,总是美丽,有点神秘,绝对神奇。”如果我们真的不得不选择与这种语言相比的角色,我们很难做出更好的选择。当然,比较,源于银河游戏官方首页设计的哲学:语言应该让程序员开心。

这一意识形态启发了大卫赫内梅尔·汉森作为他的首选首选的语言选择银河游戏官方首页,并从项目中提取了Rails框架上的银河游戏官方首页。由于语言由于银河游戏官方首页在Rails开发的成功而变得流行,因此很常见的是听到滥用“银河游戏官方首页”和“Rails”的人,或将银河游戏官方首页作为“Web语言”错误分类。

正如经验丰富的银河游戏官方首页ists所知道的那样,语言并不是任何方式限于Web开发或Web应用程序开发,并且可以用于几乎任何东西:编写本机智能手机应用程序或其他移动应用程序开发,数据处理脚本,或作为教学的工具人们要编程。

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

掌握红宝石可能很难出于几个原因,并且铁路的普及是其中之一。即,许多开发人员学到了足够的银河游戏官方首页开始使用Rails并在此之后停止探索语言。由于银河游戏官方首页的魔法键入计划,这些ROR开发人员可能很难了解纯银河游戏官方首页以及内置轨道的延伸。鉴于许多扩展轨道提供,研究语言基础的动机是减少的。

额外的复杂性位于银河游戏官方首页的多个面上。虽然它主要是面向对象的语言,但它还允许在功能规划风格中编写程序,可以利用,以便提高富有效力和代码可读性。这意味着银河游戏官方首页提供了许多方法来完成一件事,因此“A类”银河游戏官方首页程序员需要了解语言的所有不同个性。

今天我们没有多次实现银河游戏官方首页,包括MRI,J银河游戏官方首页,Rubinius和MRUBY。因此,为了提出良好的决策和判断,银河游戏官方首页开发人员必须至少意识到不同的实施,以及他们的优势和劣势。

以下指南为您提供了一些疑问,以便在为Top-Novth 银河游戏官方首页开发人员准备采访时提供灵感。您不应该纯粹地评估候选人,以“正确”回答每个问题。这将缺少这一点,因为不是每个顶级候选人都会真的了解有关该语言的所有细节,也不知道所有细节都可以保证您最好的开发人员。相反,使用问题来了解候选人如何考虑手头的问题,如何通过困难的问题,以及他们如何权衡替代方案并进行判断呼叫。例如,如果候选人不知道答案,请询问他们如何获得它,只要他们安装了一个具有互联网访问和银河游戏官方首页解释器的计算机。一个人应该告诉你很多,如果不是一个正确的答案本身就是这样。您还应在我们的博客上查看Toptal招聘候选人的普通指南: 寻找精英少数.

请注意,本指南侧重于纯银河游戏官方首页。如果您希望全日制或兼职的Rails开发人员雇用银河游戏官方首页,您也应该看看我们的 红宝石在Rails招聘指南.

欢迎来到银河游戏官方首页.

考虑本节的热身讨论:它将帮助您了解候选人是否曾经写过任何简单的Rails应用程序。

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

红宝石中的模块有两个目的:命名法和混合。

Consider an application that processes maps with points of interest. Two programmers working on this app could come up with two different classes and give them the same name. Let’s say the first one creates a class Point, which represents a point in a plane defined by xy coordinates. The programmer then uses this class when rendering maps as images. The other programmer’s Point class models a point of interest on the map and has attributes specifying the latitude, the longitude, and the description.

当银河游戏官方首页解释器找到具有相同名称的多个类定义时,它假定程序员的意图是“重新开放”之前定义的类并将新方法添加到上一个类。这可能导致道路上的各种类型的问题,因此最好将应用程序的不相关的部分不同 名称空间 in order to reduce a chance of naming collisions. To do this in 银河游戏官方首页 we can put separate behavior in different modules, e.g. RenderingGeo:

module Rendering
  Point = Struct.new(:x, :y)
end

module Geo
  Point = Struct.new(:lat, :long, :description)
end

Now the full names of the classes would change to Rendering::PointGeo::Point so there would be no conflict.

使用模块作为命名空间时,它们可以包括其他模块,类或方法。稍后,可以在其他上下文中包含模块(不同的模块或类)以删除需要完全拼写其名称的需要。

类可以包含模块,其他类和方法,但是一个不能以与模块相同的方式包含它们。

作为 混合,模块通常可以将可以包含在其他类中的方法。但是,我们无法创建模块的实例。此外,模块不能延长其他模块(但它可以包括它们)。

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

In 银河游戏官方首页, almost everything is an object, so classes and modules are objects as well. Every class in 银河游戏官方首页 is an object of type Class, which extends a class called Module. Looking at this inheritance hierarchy, we can clearly see that modules provide just a subset of features provided by classes.

问:银河游戏官方首页如何查找调用方法?

了解和使用银河游戏官方首页的全部权力要求程序员彻底了解对象在银河游戏官方首页中的工作原理。这不仅仅是为了挥舞成分的强大力量,而且还要了解最初可能看起来很奇怪的概念,比如类方法的定义。

鉴于此代码片段:

mike = Actor.new(first_name: 'Mike', last_name: 'Myers')
mike.full_name

Where would 银河游戏官方首页 look for a definition of the method full_name?

红宝石将查找该方法的第一个地方是在对象自己的 metaclass. 或者 特征类。这是一个支持每个对象的类,它包含直接在该对象上定义的方法,与所有其他实例不同。

For example, the following definition adds a method full_name to the metaclass of object mike:

def mike.full_name
  "#{first_name} #{last_name}"
end

Since the metaclass is a class specific to this object, no other instances of class Actor would have this method.

如果银河游戏官方首页无法在对象的Metaclass中找到方法,则它将开始查找该方法 祖先 的 the object’s class (i.e. the ancestors of Actor)。

那么,班级的祖先是什么?我们可以要求银河游戏官方首页告诉我们!

Actor.ancestors
# => [Actor, Object, Kernel, BasicObject]

We can see that the list of ancestors of any class in 银河游戏官方首页 begins with the class itself, includes all ancestor classes (Object, ‘BasicObject’), but also modules that are included in any of the classes in the inheritance hierarchy (e.g. Kernel)。 This is something that a 银河游戏官方首页 programmer should understand.

自银河游戏官方首页 2.0以来,由程序员决定将模块放在祖先列表中的位置。

让我们来看看两个例子。我们假设这是银河游戏官方首页版本2.0或以上:

Example 1: Including the FullName module into the class Actor.

class Actor < Person
  include FullName
end

If we now look up the ancestors list of the class Actor, we’ll see that the module FullName appears between the Actor 和 the Person classes:

Actor.ancestors
# => [Actor, FullName, Person, Object, Kernel, BasicObject]

Example 2: Prepending the FullName module to the class Actor.

class Actor < Person
  prepend FullName
end

By prepending FullName, we’ve told 银河游戏官方首页 to put the module before the class itself in the ancestors list:

Actor.ancestors
# => [FullName, Actor, Person, Object, Kernel, BasicObject]

If 银河游戏官方首页 searches the entire ancestor list and can’t find the method by the given name, 银河游戏官方首页 will internally send another message (method call) to the object: method_missing?. The system will repeat the lookup for this method, and will find it at least in the Object class (sooner, if the programmer has defined it in an earlier ancestor) and execute it.

问:银河游戏官方首页是否支持多重继承?它是必要的吗?

与其他现代语言一样,银河游戏官方首页仅支持单一继承,这是 引用了一个特征 由语言的创造者yukihiro matsumoto。

红宝石不需要支持多种继承,因为可以通过鸭键入和模块(即Mixins)来实现可以实现的一切。

由于银河游戏官方首页是一种动态类型语言,因此无需对象是特定类型的,以便为程序运行。相反,银河游戏官方首页利用鸭子打字:如果像鸭子这样的物体嘎嘎,并且像鸭子一样走,这是一只鸭子。也就是说,如果它知道如何响应邮件,我们可以询问任何对象。或者我们可以简单地发送消息并信任对象来弄清楚如何处理它。

多种继承的另一个使用是共享不同类之间的代码,该代码不能以链为链。为此,我们可以编写我们想要在模块中作为一种方法分享的代码,并根据需要将其包含到其他类中。允许分组要包含在多个类别中的方法的概念是Mixin的定义。

我们应该注意,包括一个模块进入类中将其添加到“祖先”列表中:

class Actor < Person
  include FullName
end

Actor.ancestors
# => [Actor, FullName, Person, Object, Kernel, BasicObject]

这意味着一旦模块混合了,来自超类的方法与来自Mixin的方法之间没有差异。

问:鉴于以下类声明,标识一个错误并提供解决方案。

class Worker
  attr_reader :data

  def initialize(d)
    data = d
  end

  def call
    # do a process that requires @data
  end

  private

  def data=(d)
    @data = clean(d)
  end

  def clean(d)
    # return sanitized data
  end
end

The problem is in the initialize method, which tries to assign the argument d using the private attribute writer data=. However, the setter won’t get invoked, because 银河游戏官方首页 will treat data = d as a local variable initialization. When 银河游戏官方首页 encounters an identifier beginning with a lowercase character or an underscore on a left-hand side of an assignment operator, 银河游戏官方首页 will create and initialize a local variable. Please note that this behavior is inconsistent with the way 银河游戏官方首页 handles the same identifiers in other contexts: if the identifier does not reference a defined local variable, 银河游戏官方首页 will try to call a method with the given name.

To make it clear that we want to call the writer method (i.e. the method ending with the = character), we need to prepend the name with self:

def initialize(d)
  self.data = d
end

This may seem counter-intuitive, given the rule that private methods cannot be called with explicit receiver (even if it’s self)。 However, the rule comes with an exception: the private writer methods (i.e., methods ending with =) can be invoked with self.

Another way to fix the bug would be to directly assign the value to the instance variable @data in the initializer:

def initialize(d)
  @data = clean(d)
end

经验丰富的银河游戏官方首页ist,或者一个经验丰富的程序员学习银河游戏官方首页?

来自其他编程语言的银河游戏官方首页的人可以看到一个熟悉的功能,并假设它在银河游戏官方首页中以同样的方式工作。不幸的是,这并不总是如此,红宝石有一些概念,对有一些其他语言经验的开发人员来说可能会令人惊讶。以下问题旨在将经验丰富的银河游戏官方首页ists与盲目遵循熟悉的概念并将其应用于银河游戏官方首页。

Q: Explain the difference between throw/catchraise/rescue in 银河游戏官方首页.

Like most modern Object-Oriented Programming (OOP) languages, 银河游戏官方首页 has a mechanism for signaling exceptional situations and handling those exceptions in other blocks of code. To signal an error, a 银河游戏官方首页 programmer would use the raise method, which aborts the execution of the current block of code and unwinds the call stack looking for a rescue statement that can handle the raised exception.

In that sense, the raise method performs the same job as the throw statement does in C++ and languages inspired by it, whereas rescue corresponds to the catch block. These operations should be used for signaling the exceptional state and handling it, they should not be used for normal flow control.

However, 银河游戏官方首页 also has throwcatch methods, which can put newcomers off balance, because they 用于流量控制,应该 不是 用于错误处理。

You can think of throw as a GOTO statement and catch as a method that sets up a label. However, in contrast to traditional GOTO, which can jump to any other point in the program, throw can only be used inside a catch block, as we’ll demonstrate momentarily.

It’s important to understand the syntactical differences: rescue is a keyword, not a method we could override (raise is a method, though). We can combine multiple rescue statements one after another to handle different types of errors, and we always put the rescue keyword after a block that will, potentially, raise an exception.

例如:

begin
  response = Net::HTTP.get(uri)
rescue Timeout::Error
  puts "A timeout occurred, please try later."
rescue Net::HTTPBadResponse
  puts "Server returned a malformed response."
rescue
  puts "An unknown error occurred."
end

On the other hand, catch is a method that accepts two arguments: a symbol that can be caught (a “label”), and a block inside which we can use throw. The throw method can also accept two arguments: the first is mandatory, and should be a symbol that matches the catch label to which the program should jump; the second is optional and will become the return value of the catch statement. The throw/catch pair can be useful when we need to break out of a nested loop, like in this example of looking for a free product:

free_product = catch(:found) do
  shops.each do |shop|
    shop.products.each do |product|
      if product.free?
        throw :found, product
      end
    end
  end
end

if free_product
  puts "Found a free product: #{free_product}!"
end

Q: Is there a difference between the Boolean &&/|| operators and the written versions /或者?

There is definitely a big difference between these two. Even though && (or 或者||) are semantically equal (both being short-circuit Boolean operators), they have different operator precedence.

The English operators 或者 have very small precedence. Their precedence is, in fact, less than most other 银河游戏官方首页 operators, including the assignment operator =.

考虑到这些运营商是 Python中的布尔运算符,经验丰富的Pythonistas可以滥用Huby,这可能会产生意外的逻辑错误。考虑此习语,通常用于访问可能未初始化的对象的属性:

actors = [ Actor.new(first_name: 'Mike', last_name: 'Myers') ]
name = actors[0] && actors[0].name
# => "Mike"
puts name
# => Mike

If the actors array is empty, or contains nil as a first element, the Boolean statement will immediately resolve to this value, and the name variable will be nil. If the first element of the array is truthy, however, we will then send the message name to it, and assign the result to the variable name.

但是,如果我们使用了操作员的英文版,我们会得到不同的结果:

actors = [ Actor.new(first_name: 'Mike', last_name: 'Myers') ]
name = actors[0] and actors[0].name
# => "Mike"
puts name
# => #<Actor:0x007fa07a1b4a00>

We can see that the result of the expression in the second line and the value assigned to the variable in the end are different. Because = binds tighter than , the operands were grouped around the assignment first, and only then around the operator. We can illustrate this with parentheses:

(name = actors[0]) and actors[0].name

The reason to actually have both operators in the language is to allow the use of 或者 as control flow commands in Perl style.

Q: Given below is a snippet of code that calculates a total discounted value among all products that have the discount of 30% or more in all shops. Rewrite this snippet using basic functional operations (map/filter/reduce/flatten/compact) if we assume shops is an array of Shop objects loaded in the memory, where each shop references a the list of products in the memory. Which version would you keep in the production-ready code?

total_discount = 0

shops.each do |shop|
  shop.products.each do |product|
    if product.discount >= 0.3
      total_discount += product.discount * product.price
    end
  end
end

Since we want to transform a list into a single value, this seems to be a job for the reduce method (or inject, an alias of reduce):

total_the discount = shops.reduce(0) { |total, shop|
  total + shop.products.reduce(0) { |subtotal, product|
    if product.discount >= 0.3
      subtotal + product.discount * product.price
    else
      subtotal
    end
  }
}

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

However, this approach might be somewhat harder to read, as we’ve got nested reduce operations. To simplify the code, we could first create a list of all products and then reduce it by chaining operations:

total_discount = shops.
  flat_map { |s| s.products }.
  reduce(0) { |total, product|
    if product.discount >= 0.3
      total + product.discount * product.price
    else
      total
    end
  }

如果我们愿意通过将不同类型的操作分成单独的块来进一步提高可读性,以便将不同类型的操作拆分为单独的块:

total_discount = shops.
  flat_map { |s| s.products }.
  select { |p| p.discount >= 0.3 }.
  map { |p| p.discount * p.price }.
  reduce(0) { |sum, d| sum + d }

重要的是重复我们阻碍了这种变化的性能:新代码将通过同一产品列表多次迭代。如果此代码不在性能关键路径中,则可以通过可读性的提高来对此降低。

算法讲话,两个操作都是线性的,所以对于一个非常大的产品,代码的风格可能不是至关重要的。

另一方面,我们获得了代码,该代码声明地列出了初始列表的处理中的步骤,同样地输入了SQL查询。

红宝石 Guru应该知道如何推理改变,衡量两个解决方案的性能并做出与上下文相关的决定。你的目标在这里不应该等待“正确”的答案,而是听取程序员,了解她或他如何判断各种选择。

Q: What’s the difference between public, protectedprivate visibility in 银河游戏官方首页?

方法可见性说明符是一个经常浏览熟悉几乎任何其他OOP语言的银河游戏官方首页的新人。

公众可见性是银河游戏官方首页中的默认位置,它的行为就像它以任何其他语言一样。公共方法可以通过可以访问该方法对象的任何对象调用。

However, private visibility is different. In 银河游戏官方首页, private methods can be directly called only if we don’t explicitly specify the message receiver.

考虑找到找到的实施 n-th使用备忘录的递归的斐波纳契数:

class MemoizedFibonacci
  def initialize
    @memo = {}
  end

  def get(n)
    @memo[n] ||= calculate(n)
  end

  private

  def calculate(n)
    return 1 if n <= 1
    get(n-1) + get(n-2)
  end
end

We have a public method get 和 a private method calculate. The public method first checks if the result was previously calculated by looking it up in the @memo hash. If it wasn’t, it will call the calculate method and store the result in the hash.

Let’s try to make a slight modification to the get method:

def get(n)
  @memo[n] ||= self.calculate(n)
end

Newcomers know that self in 银河游戏官方首页 is equivalent to this in languages like C++, C# and Java, so they are led to believe this change would have no effect. However, we’ve now added the explicit receiver, self, to the message calculate. Since 银河游戏官方首页 requires that private methods are called without an explicit receiver, this would produce an error!

Another unexpected side effect of this rule is that private methods can be called from subclasses. In fact, many things we consider “keywords” in 银河游戏官方首页, are nothing but private methods in the module Kernel, which is included by the Object class and which are therefore inherited by every 银河游戏官方首页 object. For example, when we raise an exception using raise, we’re actually calling a private method of a superclass!

红宝石是一种开放的语言,所以甚至没有让开发人员锁定他们的私人,以便说话。

This leaves the protected visibility. It behaves like public, but with an exception: protected methods can be called only from the methods of the same class or any of its subclasses. You will notice that in this sense, protected behaves in a similar manner to the private visibility of other languages. This means that protected method visibility should be used in classes which want to hide their state, but allow calling the method from other methods in the class that need it to produce copies or implement comparisons.

大局

问:名称至少有三种不同的银河游戏官方首页实现。讨论其中的差异。

调用标准的银河游戏官方首页实现 MRI. (Matz的红宝石翻译员短暂) 邋..。由于名称表明,它是由Yukihiro“Matz”Matsumoto在C的编写。作为其作者的首要实施,它不能让它与语言一起生长。即使是语言的ISO规范(ISO / IEC 30170:2012),规格已经过时了,释放了银河游戏官方首页 2.0。因此,所有新语言功能都将首先出现在MRI中,然后他们可能会在其他解释器中实现。写在C中,MRI可以与其他C代码互操作,并在C中编写的GEMS。

此实现的最常见的问题之一是缺乏对真正的并行化的支持,因为MRI 银河游戏官方首页仅支持绿色线程,并取决于全局翻译锁(g)。

rubinius. 是另一个实施,基于 llvm.,并用C ++和银河游戏官方首页编写。它通过使用本机线程和即时(JIT)编译器来提高并发性。此外,核心库主要以银河游戏官方首页编写,使得更容易理解内部,尤其是对C的人不太舒适。

MRI.和语言之间的耦合使得难以使银河游戏官方首页的其他实现更新,这意味着它们可能缺乏在最近的MRI版本中发现的功能。 Rubinius团队所做的第一件事之一 rubyspec.:银河游戏官方首页语言的可抵押规范,这将允许语言叉的开发人员检查他们对“标准”的实施。不幸的是,该项目最近在得出结论后,该项目最近被创造者停止了 没有在银河游戏官方首页社区提供所需的结果.

请注意,Rubinius不一定 跟上来 使用银河游戏官方首页语言的模式:版本3将添加未计划的功能,包括银河游戏官方首页本身,包括函数,逐渐打字和多次调度。

那些需要用银河游戏官方首页接口Java代码的人可能会找到 jruby. 有用。与Rubinius一样,它通过依赖于本机线程,并将BIT编译成机器代码,提供改进的并发选项。作为奖励,它提供了与现有的Java虚拟机(JVM)代码(您可以使用本机Java类和库)以及在任何JVM上运行银河游戏官方首页的可能性。

由于J银河游戏官方首页依赖于JVM,这意味着它不能使用用纯C编写的银河游戏官方首页 Gem。虽然此实现提高了运行时速度,但它引入了缓慢的应用程序开始时间。

另一个值得注意的实施是 MRUBY.:银河游戏官方首页 ISO标准的嵌入子集。 Matz自己正在领导它的发展,实现银河游戏官方首页作为现有应用程序和游戏内的嵌入式语言,提供纯专业和自动化,从而充满挑战Lua。

您可以阅读更多关于其他银河游戏官方首页实现的更多信息 我们的博客文章有关银河游戏官方首页口译员和runtimes的帖子.

包起来

一个完美的银河游戏官方首页开发人员不是一个将盲目优化代码的开发人员,因此它会更快地运行几毫秒或消耗几兆字节的内存,而不是旧的内存。在美国或国外的完美候选人将知道,当表现本质时,如何实现如何实现这一目标,但如果它将牺牲过多的可读性和可维护性,就可以推荐替代方案。但完美的候选人也不会捍卫书面差不多的算法为“美丽”。在银河游戏官方首页中,人们可以说,完美妥协和良好的判断呼叫。请记住,在与您的候选人交谈时,并倾听他们的推理。

愉快的面试!

特色Toptal 银河游戏官方首页 Publications

顶级红宝石开发人员需求量很高。

开始招聘