interview - tianlu1677/tianlu1677.github.io GitHub Wiki
忍不住贴下我自己心中的答案, 有什么不对的地方请多多指点. 就说说和Ruby基础相关, Rails的, 看过源码加上自己的理解一般都能说上两句...里面涉及的东西太多了.
首先说明一下面试题的背景, 项目不用 Rails而是用Sinatra, 后期很可能要转为Padrino. 所以对Ruby本身的基础知识要求比较严格, 很多gem包都是直接提供给Rails用的, 如何把它们拿来用于我们的项目, 是一个小小的挑战.
Ruby基础相关
- 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版本之间的不同.
并且, 我可以继续和你讨论下有关闭包及相关作用域的问题...
- 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及相关项目经验.
- 画个图, 体现一下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