Ruby 一份 Ruby 面试题

neverlandxy_naix · 2013年08月12日 · 最后由 yanglaocong 回复于 2018年07月16日 · 23608 次阅读

出了份 Ruby 面试题,主要是考察对 Ruby 本身 掌握的深度. 给大家看看有什么不妥的地方。

Ruby 基础相关

  1. eachmap 的区别
  2. proc, lambda, 和 Proc 的区别
  3. alias 的用法,aliasalias_method 的区别
  4. 用过那些 gem, 简单的说一说各自的用途
  5. 画个图,体现一下 Ruby 的对象体系

Ruby 与 Rails 进阶相关

  1. yield self 的用法,写个例子
  2. scope 的实现原理
  3. ActiveSupport::Concern 模块的用法及源码解读
  4. alias_method_chain 的用法及源码解读

恩,这个挺朴实的

这几个题目很赞,每个题目都暗藏陷阱,深浅不一,特别适合观察应聘者对题目的反应。

Ruby 元编程书里的例子占了 60%...

#2 楼 @zuozuo 不过这个方法写的很赞

#6 楼 @hooopo 我也觉得很讨厌,因为好多都做不出来 T_T

#7 楼 @blacktulip 我也记不住这些东西.. 但是我搜一下就会了 ..

#7 楼 @blacktulip #8 楼 @hooopo

说实话,如果我去这家公司面试,一大半我都答不上来,或者说无法给出最标准,正确的答案。但是面试中是否能一击即中的回答出问题,我觉得还是面试中的表现更重要吧,自信,乐观,以及给出自己的问题分析,或者告诉对方答案去那里找,如何找到这样。

其他问题还好,就是感觉第一道题有点蛋疼。。。

#9 楼 @lgn21st 同意分析问题,但这些问题都不是可以去分析的。大部分是你看过别人的一些文章你就知道结论了,没看过就只能瞎扯。

  1. proc, lambda, 和 Proc 的区别
  2. alias 的用法,alias 与 alias_method 的区别

#6 楼 @hooopo 面试真的会经常碰到这些题目?

第 2 个记不住

#12 楼 @swachian 你都遇到什么题目?

#11 楼 @hooopo 我脑子里面把每个题目都过了一遍,自己对答案有把握的,以及不太有把握的,但是不管是否有没有把握,我感觉都可以从自己的角度分析啊。至少分析的过程中可以阐述清楚自己知道的部分和没有把握但是了解的一些相关的背景部分......

元编程的还好,Rails 这几个真的不会 求指教。。。

* scope 的实现原理
* ActiveSupport::Concern 模块的用法及源码解读
* alias_method_chain 的用法及源码解读

#6 楼 @hooopo 其实您说的都是考察面试者实际解决问题的能力,但是我如何考察其对 Ruby 本身掌握的熟练程度呢? @lgn21st 其实我心中对这些题目都有几个关键点,回答了这几个关键点,可以看出面试者对 Ruby 的涉及范围有多广,而不是简单的拿来 rails 就开始用,魔法糖用起来是很爽,但是具体怎么实现的却不知道,如何扩展这个魔法糖也不知道,我认为这不是一个真正的 rubist BTW, 发这个帖子就是为了

给大家看看有什么不妥的地方。

#17 楼 @neverlandxy_naix 只有面试者清楚了如何用 Ruby 解决问题才能知道要考察被面试者的关键点...

当然,如果你觉得考察扩展魔法糖很重要,就出些此类题目咯。

但我觉得面试重要的还是基础知识和常识,我们高中有个老师出考试题目从来不出难题怪题和原题,但是却能让高水平学生打高分,低水平学生打低分.. 我觉得这是出题的目的。

@lgn21st @neverlandxy_naix 我说的也是好的面试题该是什么样的,和出题者或回答者无关。

干脆楼主都给讲讲吧

基本上都是元编程占了大半了 我也只能说出个大概,有些只是了解过,但要用的正确可能要去查下使用方法。。

哈哈,我大部分答不出。我对 Rails 的魔法充满信任,只有出 Bug 的时候会去看源码。

#18 楼 @hooopo +1, 人类最宝贵的是学习能力

最讨厌的就是那种流传于网上谁花 10 分钟看过都能吹牛的题目,著名的有 i++ + ++i 类似的

看到这些题目就害怕,偷偷去找答案,过两天准忘掉。 面试何必搞这么复杂,给一台电脑直接写代码不就得了。

不如考 FizzBuzz,谁答案字符数最少就选谁

http://c2.com/cgi/wiki?FizzBuzzTest

#24 楼 @bhuztez 把一个正常运行的程序改坏掉,谁最快时间内修回来就选谁..

#25 楼 @hooopo 写程序和改 Bug 是两种不同的技能

#26 楼 @bhuztez 嗯 写程序是创造 bug,改 bug 是消灭 bug

#27 楼 @hooopo 写程序是创造 bug,改 bug 是消灭出更多 bug

#24 楼 @bhuztez B 大的题目就是高端大气牛 13,我来试试

gem install fizzbuzz

require 'fizzbuzz'
puts fizzbuzz

#29 楼 @camel 那加一条限制不能用第三方库

这些问题都能 100% 答对的人,未必能写出清晰优雅的代码,我觉得那才是最重要的。网上或书上能查到的东西却是次要的,尽管对这些知识越熟悉越好。 假设有一天,科技发展到知识能够直接上传到大脑里,这些考题就完全没有意义了。

#30 楼 @bhuztez 不用加这条限制,只需把 gem 的代码行数也算进去

#33 楼 @hooopo #32 楼 @blacktulip 如果有二位这么聪明的头脑,我就不写 code 了

#30 楼 @bhuztez 用 brainfuck 写可以吗?

>++++++++++[<++++++++++>-]<[>+>[-]>++++++++++[<++++++++++>-]<+<<[->>->+<<<]>>>
 [-<<<+>>>]<>>+++<<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>[-<+>]+>[-]>[<<->>[-]]>[-]
 <<<[[-]++++++++++[>++++++++++<-]>++.+++.[-]<[-]+++++++++++[>+++++++++++<-]>+..
 [-]<[-]<<[-]>>]<>>+++++<<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>[-<+>]+>[-]>[<<->>[
 -]]>[-]<<<[[-]+++++++++[>+++++++++++<-]>-.[-]<[-]+++++++++[>+++++++++++++<-]>.
 +++++..[-]<[-]<<[-]>>]<<[[-]>>++++++++++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]>>[
 >++++++++[<++++++>-]<.[-]]<>++++++++[<++++++>-]<.[-]<<<]>[-]++++++++++.[-]<[-]
 <-]

我承认很长,短的就请 B 大来吧

#34 楼 @camel 你这个让我想起那个著名的挑战:用 Ruby 完成 fizzbuzz,但是不能用任何一项以下列出的的东西

gems, standard lib, modules, methods, classes or objects control flow, assignment, arrays, strings, numbers, booleans

#34 楼 @camel 我的好像长了点

puts (1..100).map{|i|[i,"Fizz","Buzz","FizzBuzz"][~i%5/4*2+~i%3/2]}

#35 楼 @blacktulip 直接说能用啥吧 #36 楼 @bhuztez 这个。。。数学也太高端了吧

#37 楼 @camel 不告诉你,让你自己想想 Ruby 去掉这些还剩啥,哈哈

#38 楼 @blacktulip

puts "1\n2\nFizz\n4\nBuzz\nFizz\n7\n8\nFizz\nBuzz\n11\nFizz\n13\n14\nFizzBuzz\n16\n17\nFizz\n19\nBuzz\nFizz\n22\n23\nFizz\nBuzz\n26\nFizz\n28\n29\nFizzBuzz\n31\n32\nFizz\n34\nBuzz\nFizz\n37\n38\nFizz\nBuzz\n41\nFizz\n43\n44\nFizzBuzz\n46\n47\nFizz\n49\nBuzz\nFizz\n52\n53\nFizz\nBuzz\n56\nFizz\n58\n59\nFizzBuzz\n61\n62\nFizz\n64\nBuzz\nFizz\n67\n68\nFizz\nBuzz\n71\nFizz\n73\n74\nFizzBuzz\n76\n77\nFizz\n79\nBuzz\nFizz\n82\n83\nFizz\nBuzz\n86\nFizz\n88\n89\nFizzBuzz\n91\n92\nFizz\n94\nBuzz\nFizz\n97\n98\nFizz\nBuzz"

#39 楼 @jjym 用了 string,sorry

#40 楼 @blacktulip

puts DATA.read
__END__
1\n2\nFizz\n4\nBuzz\nFizz\n7\n8\nFizz\nBuzz\n11\nFizz\n13\n14\nFizzBuzz\n16\n17\nFizz\n19\nBuzz\nFizz\n22\n23\nFizz\nBuzz\n26\nFizz\n28\n29\nFizzBuzz\n31\n32\nFizz\n34\nBuzz\nFizz\n37\n38\nFizz\nBuzz\n41\nFizz\n43\n44\nFizzBuzz\n46\n47\nFizz\n49\nBuzz\nFizz\n52\n53\nFizz\nBuzz\n56\nFizz\n58\n59\nFizzBuzz\n61\n62\nFizz\n64\nBuzz\nFizz\n67\n68\nFizz\nBuzz\n71\nFizz\n73\n74\nFizzBuzz\n76\n77\nFizz\n79\nBuzz\nFizz\n82\n83\nFizz\nBuzz\n86\nFizz\n88\n89\nFizzBuzz\n91\n92\nFizz\n94\nBuzz\nFizz\n97\n98\nFizz\nBuzz

抱歉,刚没注意到。。

#41 楼 @jjym puts 是 method 吧

#41 楼 @jjym #read 是个 method 吧?

眼看又挖了一个大坑

#42 楼 @bhuztez #43 楼 @blacktulip 好吧。。太丧心病狂了

上面的题,我也答不上几道 我面试别人的时候还是关注他的真实项目经验多点

我也出了题,但基本上我只扫一眼,题只是用来大概知道一个人的水平

走之前告诉大家答案在 这里

#47 楼 @blacktulip 👍 如果 [] 不是方法就完美了...太丧心病狂了

#47 楼 @blacktulip Write a program that prints,你的答案明显不行啊

我除了 ruby 4 和 rails 1 能回答的上来,其他都不知道。。。作为初学者,貌似几乎没怎么用到过。这个很重要的吗?

#37 楼 @camel 还不如 JavaScript 呢

for(i=1;i<101;i++){print((i%3?"":"Fizz")+(i%5?"":"Buzz")||i)}

Java 程序员漂过,做不出来。。。。。

#51 楼 @Ryan each 和 map 应该也能稍微说说吧

如果不是日日写和研究一些细节,的确回答不出来,可能我功力还不够,无法胜任此工作啊

@blacktulip 这个其实看看 API 就知道的啊

each 只是遍历一遍 map 这个是 alias collect,会返回一个由block执行结果组成的数组

#56 楼 @tumayun 我知道啊,我是说 #51 楼 应该不止会他说那两题..

最近听 tiny4voice 深知,要找能解决问题的人

#54 楼 @blacktulip each 常用,map 没用过啊,不过感觉和 each 功能类似吧。

#35 楼 @blacktulip

无 method

`echo '1\n2\nFizz\n4\nBuzz\nFizz\n7\n8\nFizz\nBuzz\n11\nFizz\n13\n14\nFizzBuzz\n16\n17\nFizz\n19\nBuzz\nFizz\n22\n23\nFizz\nBuzz\n26\nFizz\n28\n29\nFizzBuzz\n31\n32\nFizz\n34\nBuzz\nFizz\n37\n38\nFizz\nBuzz\n41\nFizz\n43\n44\nFizzBuzz\n46\n47\nFizz\n49\nBuzz\nFizz\n52\n53\nFizz\nBuzz\n56\nFizz\n58\n59\nFizzBuzz\n61\n62\nFizz\n64\nBuzz\nFizz\n67\n68\nFizz\nBuzz\n71\nFizz\n73\n74\nFizzBuzz\n76\n77\nFizz\n79\nBuzz\nFizz\n82\n83\nFizz\nBuzz\n86\nFizz\n88\n89\nFizzBuzz\n91\n92\nFizz\n94\nBuzz\nFizz\n97\n98\nFizz\nBuzz' >&2`

Mark 下,先看看

没有我们的题偏 😉

最近想换份 ruby 的工作,看了这个题之后,哭了……

如果不准备准备,还真是一道都说不出来.....

每题都很高深。

匿名 #66 2013年08月14日

除了第二个,其他都不会的要不要啊?那岂不是去面试就要挂了啊……

考的还是比较深的 初学者表示压力山大啊 1

原来 map 就是 collect

Example:
  select("post", "person_id", Person.all.collect {|p| [ p.name, p.id ] }, {:prompt => 'Select Person'})

could become:
  <select name="post[person_id]">
    <option value="">Select Person</option>
    <option value="1">David</option>
    <option value="2">Sam</option>
    <option value="3">Tobias</option>
  </select>

偶去了,十有八九得哭着回来啊~!

ActiveSupport::Concern 这个也问~~

ActiveSupport::Concern 模块的用法这个问题其实貌似挺简单的:

.... I discourage pulling sets of methods out of a large ActiveRecord class into “concerns”, or modules that are then mixed in to only one model. I once heard someone say: Any application with an app/concerns directory is concerning. And I agree. Prefer composition to inheritance. Using mixins like this is akin to “cleaning” a messy room by dumping the clutter into six separate junk drawers and slamming them shut. Sure, it looks cleaner at the surface, but the junk drawers actually make it harder to identify and implement the decompositions and extractions necessary to clarify the domain model.

via: 7-ways-to-decompose-fat-activerecord-models

面试题好不好,社区的同学们各自做一做(不借助任何参考资料)就知道了,如果大家都不会的可能就是不重要的。 先占位,有空写我的答案

占位以后忘了写答案了,刚好这会有空,补一下作业

Ruby 基础相关

  1. each 和 map 的区别

map是将block施加与array的每一个成员之上,并将计算结果组织为新的array,each只有前半部分,不会组织成新的array

  1. proc, lambda, 和 Proc 的区别

proc记得不太清楚了,好像是内部能够支持return到外层,lambda比较简单,就是普通的lambda闭包(return不能跨越作用域),它们创建的对象,其class都是Proc

  1. alias 的用法,alias 与 alias_method 的区别

alias是ruby语言关键字,对当前类的method定义别名,alias_method是库增强(好像是active support),参数是symbol

  1. 用过那些 gem, 简单的说一说各自的用途

rails中的active support等gem,基本都是辅助增强

ActiveRecord是支持延迟计算的ORM库,mongoid不用解释了

http client: faraday/mechanize,前一个轻一些,后一个使用cookie比较方便

以前用过activescaffold,还有个gem记不清名字了,好像是hpriot,以前用来抓网页,作者应该是_why大神

inheritance_resources/inheritance_resource_views 用来简化开发

statemachine 简化模型类的逻辑代码

railroady,用来生成模型图比较方便

redis_search,华顺写的,用它可以晚一些引入搜索引擎

还有god、pry、各种http app server、各种测试/mock框架

  1. 画个图,体现一下 Ruby 的对象体系
Object -> Module -> Class -> MyClass
另外:
Object.new.class = Class
Class.superclass = Object

Ruby 与 Rails 进阶相关

  1. yield self 的用法,写个例子
class Builder
  def initialize arguments
     # do somthing by init arguments
  end

  # you can use Builder's method in block
  def build
    yield self if block_given?
  end
end
  1. scope 的实现原理

核心是延迟计算,将where、order、limit子句变为Relation对象,然后在最终调用each/to_a时组装sql

  1. ActiveSupport::Concern 模块的用法及源码解读

用来简化module编写,普通的module方法是include所在类的实例方法,Concern可以借助一个ClassMethod的内部module,提供类方法增强

  1. alias_method_chain 的用法及源码解读

详细不记得了,大致是对一个method提供arround类型的aop增强,实现方法应该还是借助了alias机制,将目标method改名,然后用旧名称创建一个新的method,新method调用了改名后的method,并在调用前(or 调用后?)执行chain上的其它方法

73 楼 已删除

基本不会,不明觉厉。

#72 楼 @fsword 自己检查了一下,果然很多错误啊,比如这个:

Object.new.class = Class
Class.superclass = Object

前一句写错了,应该是 Object.class == Class 后一句也写错了,改正以后也是句废话

#75 楼 @fsword 谢谢你的精彩回复,我刚学 Ruby 的时候就知道你了,taobao 的阿福^_^ 忍不住贴下我自己心中的答案,有什么不对的地方请多多指点。 就说说和 Ruby 基础相关,Rails 的,看过源码加上自己的理解一般都能说上两句...里面涉及的东西太多了。

首先说明一下面试题的背景,项目不用 Rails 而是用 Sinatra, 后期很可能要转为Padrino. 所以对 Ruby 本身的基础知识要求比较严格,很多 gem 包都是直接提供给 Rails 用的,如何把它们拿来用于我们的项目,是一个小小的挑战。

Ruby 基础相关

1. each 与 map 的区别 涉及知识点:Ruby 迭代器的基本知识 为什么要问这个问题,主要是考察 Ruby 迭代器的基本知识点,我看过一些代码,比如下面这个:

def get_all_people_name
  arr = []
  @peoples.each do |p|
    arr << p.name
  end
  arr
end

# 完全可以用一行代码搞定
@peoples.map &:name

其实我更想问的是,如何用 each 写一个类似 map 的方法

module Kernel
  def my_map &block
    arr = []
    each { |i| arr << block.call(i) }
    arr
  end
end

2. proc, lambda, 和 Proc 的区别 涉及知识点:Ruby 中的闭包 这个题目几乎要被用滥了,但是为什么还要出这个题目呢? 就是想知道你知不知道闭包这个东西... 认真学过 Ruby 闭包的同学闭着眼都能说出一两句,如果你接触过 Ruby1.8 中的闭包,也会知道 proc(), lambda() 与 Proc.new() 与现在 Ruby 版本之间的不同。

并且,我可以继续和你讨论下有关闭包及相关作用域的问题...


3. alias 的用法,alias 与 alias_method 的区别 涉及知识点:Ruby 中的关键字 - alias, Module 中的方法 - alias_method. 用过 alias 和 alias_method 就可以发现它们之间用法的区别。

然后我会顺便问问你,为什么要写这个 alias...

另外有个隐晦的地方,alias_method 是有返回值的...当然,it is a joke.

static VALUE
rb_mod_alias_method(VALUE mod, VALUE newname, VALUE oldname)
{
    rb_alias(mod, rb_to_id(newname), rb_to_id(oldname));
    return mod;
}

4. 用过那些 gem, 简单的说一说各自的用途 这个用于聊一聊相关的 gem 及相关项目经验。


5. 画个图,体现一下 Ruby 的对象体系 涉及知识点:Ruby 对象体系 不多说了,直接看代码和图,不了解 Ruby 对象体系,就不会明白这个方法为什么要写在 Object 类里面

class Object
  # activesupport/lib/active_support/core_ext/object/try.rb

  def try(*a, &b)
    if a.empty? && block_given?
      yield self
    else
      __send__(*a, &b)
    end
  end
end

嘿嘿,涉及 alias 与 alias_method 的知识点上,我现眼了......

#76 楼 @neverlandxy_naix 体系图漏了鬼类吧,这图好像解不了 singleton method

#78 楼 @blacktulip 这确实是这张图的一个大 bug 啊.... 难道真要在每一个 class 上面都画上一个 eigenclass, 然后 eigenclass 的关系用虚线表示,其走向跟实线一样?

#79 楼 @neverlandxy_naix 画在实例后面露一半出来就行了…关系线就省略了口述吧…

#80 楼 @blacktulip 改天再画一张,eigenclass 直接塞到 class 里面去😄 这张图是当时在 windows 下用 word 画的,真蛋疼

#78 楼 @blacktulip #79 楼 @neverlandxy_naix 这类问题不需要在图上详述,适合在面试时不断深入沟通

天天写代码,重复同样的工作,其实我也烦了,真想学更深层次的知识呀

前天面试这些题都有哈哈,没答上来几个,尴尬

😂 楼主你出来,我不打死你,你知道我被这套题面试过多少次了?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号