NoPoint 遇到的 ruby 问题总结

chenyunli · 2017年10月18日 · 最后由 coderek 回复于 2018年04月01日 · 2980 次阅读
  1. ruby 的命名规则 局部变量:以英文字母或者_开头,如:

    name = "this is a local variable"
    

    全局变量:以 $ 开头,如:

    $name = "this is a global variable"
    

    实例变量:以@开头,如:

    @name = 'lily'
    

    类变量:以@@开头,如:

    @@name = 'lily'
    

    常量:全大写字母,如:

    NAME
    

    类名和模块名:以首字母大写,驼峰命名法。如:

    HelloWorld
    

    方法名:小写用_隔开,如:

    sort_by_name
    
  2. ruby 中 singleton class 和 singleton method 分别是什么

    Singleton method

    A method which belongs to a single object rather than to an entire class and other objects. 一个方法只属于一个对象,而不是整个类和其他实例化对象。

    firstObj = ClassMethods.new
    secondObj = ClassMethods.new
    
    def firstObj.singletonMethod
      "Hi am a singlton method available only for firstObj"
    end
    
    firstObj.singletonMethod # "Hi am a singlton method available only for firstObj"
    
    secondObj.singletonMethod #undefined method `singletonMethod' for #<ClassMethods:0x32754d8> (NoMethodError)
    

    So this “singletonMethod” belongs only to the firstObj object and won’t be available for other objects of this class. If you try to make the secondObj.singletonMethod Ruby will inform you that singletonMethod is an undefined method.

    所以,singletonMethod 只属于 firstObj,不能被这个类的其他实例化对象所调用。如果你想用 secondObj.singletonMethod 调用这个单例方法,ruby 会告诉你 singletonMethod 没有定义

    If you like to find all the singleton methods for a specific object, you can say objectname.singleton_methods In our case

    如果你想找到一个特定对象的所有单例方法,你可以用 objectname.singleton_methods 。在我们的例子里面就是:

    firstObj.singleton_methods => ["singletonMethod"]
    secondObj.singleton_methods => []
    

    To avoid throwing undefined method error when you try to access a singleton method with some other object

    避免调用单例方法****抛出方法未定义的异常:

    if secondObj.singleton_methods.include?("singletonMethod")
      secondObj.singletonMethod
    end
    
    # 或
    
    if secondObj.singleton_methods.include?( :singletonMethod )
      secondObj.singletonMethod
    end
    

    Singleton classes 单例类

    A singleton class is a class which defines a single object. 单例类就是只有一个实例对象的类。

    In our above example we have two objects firstObj and secondObj. We can create a separate class for the secondObj instance and that is called as a singleton class. So as per the definition we created a class for a single object.

    在我们上面的例子里面,我们有两个对象,firstObj 和 secondObj。我们给 secondObj 实例 创建一个单独的类,这就叫做单例类。 所以按照定义为一个单独的对象我们创建了一个类。

    class << secondObj
      def method4
        p "Hi am a singlton method available only for secondObj"
      end
    end
    

    When you see a class definition with the class keyword followed by two less than symbols that is a Singleton class opened for the object. In our ClassMethods class we had something like class << self which is also a singleton class. In Ruby a class itself is an instance of the Ruby class Let's try something like this

    当你看到定义一个类后面跟着 << 的时候,这就是打开这个对象的单例类。 在我们的 ClassMethods 这个类中,我们有 class << self ,所以这也是一个单例类。在 ruby 里,一个类本身也是一个 ruby 的类。让我们试试

    ClassMethods.class # Class
    
  3. 怎么写一个 module,可以让包含这个 module 的 class 既能使用这个 module 的类方法又能使用这个 module 的实例方法

    参考 http://motion-express.com/blog/include-instance-&-class-methods-from-a-module

    module Foo
     def self.included(m)
       def m.show1
         p "hi"
       end
     end
    
     def show2
       p "hello"
     end
    end
    
    class Bar
     include Foo
    end
    
    Bar.new.show2 #=> "hello"
    Bar.show1 #=> "hi"
    
    Bar.show2 #=> NoMethodError: undefined method `show2' for Bar:Class
    Bar.new.show1 #=> NoMethodError: undefined method `show1' for #<Bar:0x007fa1fb8c2ce8>
    

    module A
      def b
        puts "method b from module A"
      end
    
      def c
        puts "method c from module A"
      end
    end
    
    class B
      include A
      extend A
    end
    
    B.new.b # => "method b from module A"
    B.b     # => "method b from module A"
    B.new.c # => "method c from module A"
    B.c     # => "method c from module A"
    
  4. require load auto_load 以及 require_dependency 的区别

    require,load用于文件,如.rb等等结尾的文件。 include则用于包含一个文件(.rb等结尾的文件)中的模块。 require一般情况下用于加载库文件,而load则用于加载配置文件。 require加载一次,load可加载多次。

    详细参考: 浅谈Ruby中的类加载机制

    Require/load/autoload的区别和用法

    ActiveSupport::Autoload 学习

    Here are the differences between Require, Load, Include and

  5. 描述 object, class, module 的关系是什么,并画图表示。

    从继承关系来说,是Class --> Module --> Object,即Object是继承树的顶层,紧接着是Module,然后是Class。
    Modules, Classes, and Objects

    Object -> Module -> Class -> MyClass
    另外:
    Object.class = Class
    Class.superclass = Module
    
  6. 为什么在 model 中可以调用 validates,自己怎么实现 model 中的 validates,试着实现一下?

    validations

  7. ruby 中 ? 或者 ! 作为后缀的方法有什么不同?

    It's "just sugarcoating" for readability, but they do have common meanings: Methods ending in ! perform some permanent or potentially dangerous change; for example: Enumerable#sort returns a sorted version of the object while Enumerable#sort! sorts it in place. In Rails, ActiveRecord::Base#save returns false if saving failed, while ActiveRecord::Base#save! raises an exception. Kernel::exit causes a script to exit, while Kernel::exit! does so immediately, bypassing any exit handlers. Methods ending in ? return a boolean, which makes the code flow even more intuitively like a sentence — if number.zero? reads like "if the number is zero", but if number.zero just looks weird.

    在Ruby中,以问号(?)结尾,被用于标示谓词,即返回Boolean值的方法,如Array.empty?(判断数组中元素是否为空)。

    在Ruby中,以问号(?)结尾,出现在方法名词尾部,表示使用该yyifc是需要多加小心的。 而通常情况下,不带感叹号的方法不带感叹号的方法返调用该方法的一个拷贝,二带感叹号的方法则是一个可变方法,该方法会修改原来的对象,如Array类中的sort和sort!

  8. 有没有读过 rails 源码?

    只瞅过几眼

  9. rails 本身是由什么组成的?

    Rails组成和项目结构

  10. 有没有读过 《ruby 元编程》?

    没有呢(心里想,回去赶紧买一本拜读一下)

  11. 工作中遇到过哪些挑战和困难,怎么解决的?

  12. 不使用 ActiveJob,sidekiq 单独使用可以不?

    Active Job 和 Sidekiq 简介 Active Job Rails: 使用Active Job来处理异步任务

  13. bundler 和 gem 的关系?bundler 是 gem 么?

    bundler Rvm 与 Bundler 的爱恨情仇 RVM,RubyGems和Bundler的日常使用

  14. passenger, nginx, 还有一个是什么,忘记了,这三个各自干什么的,怎么结合起来一起工作,缺一可以不

    Ruby 服务器对比

  15. each 和 map 的区别

    each: 顺序返回各个元素 collect: 把原数组的各个元素顺序返回,并组装新的数组 map: 与 collect一样,会创建一个新的数组 select: 与collect一样,会创建一个新的数组

    Ruby: 聊一聊关于集合遍历的各种方法 Pluck vs. map and select

    $ a = [1,2,3,4]
     => [1, 2, 3, 4]
    $ a.each {|n| n*2}
     => [1, 2, 3, 4]
    $ a
     => [1, 2, 3, 4]
    $ a.map {|n| n*2}
     => [2, 4, 6, 8]
    $ a
     => [1, 2, 3, 4]
    $ a.collect {|n| n*2}
     => [2, 4, 6, 8]
    $ a
     => [1, 2, 3, 4]
    
  16. find 和 find_by 的区别

    rails中find/find_by/where的区别

  17. 解决 N+1 Query 的方法有哪些

    浅谈 ActiveRecord 的 N + 1 查询问题 Rails使用include和join避免N+1 queries 片段缓存,也可以解决查询问题(不去数据库层面,也就不会涉及 N+1 了)

  18. 单表继承

    Rails 之单表继承 (Single Table Inheritance) Inheritance 单表继承 ActiveRecord-连接多张表之单表继承

  19. rack 是什么

    Rails on Rack

  20. 安全问题。怎么破 XSS 和 CSRF攻击

    解法: 对于XSS(Cross-site scripting),跨站脚本攻击,攻击者在客户端注入可执行代码。 对策: 过滤恶意输入非常重要,但是转义 Web 应用的输出同样也很重要。 过滤恶意输入白名单比黑名单要有效,特别是在需要显示未经过滤的用户输入时(例如前面提到的的搜索表单的例子)。使用 escapeHTML() 方法(或其别名 h() 方法),把 HTML 中的字符 &、"、< 和 > 替换为对应的转义字符 &、"、< 和 >。

    对于CSRF:Cross Site Request Forgery,跨站请求伪造。通俗理解:攻击者盗用当前用户身份,发请当前用户的恶意请求:如邮件,银行转账等。 对策:首先,根据 W3C 的要求,应该适当地使用 GET 和 POST HTTP 方法。其次,在非 GET 请求中使用安全令牌(security token)可以防止应用受到 CSRF 攻击。

  21. ActiveSupport::Concern 的工作原理

    参考 ActiveSupport::Concern ActiveSupport::Concern 的工作原理

  22. Rails: pluck与select的区别

  23. 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. 标题/正文描述不清不楚;
  2. 无意义的发帖;
  3. 存在广告嫌疑;
  4. 招聘信息描述不清楚,未按照招聘节点的要求发帖,或职位信息不符合社区用户群需求;
  5. 新注册的帐号发布产品推广贴是不允许的哦,付出和回报是相等的,当然如果你的产品确实非常有意思,或是和 Ruby 有关的东西,是不会进入这个栏目的。
  6. 太过弱的提问会被直接转移到此节点,请在提问前多尝试,多搜索;
  7. 理论上,不允许发布 QQ 群、微信群之类讨论群。

如果你发现你的帖子被屏蔽,请自我检查反省,并修改帖子内容。


招聘贴被屏蔽原因

警告: 以后招聘贴不符合要求,直接屏蔽,管理员不再回复,如认真阅读,继续新发同样格式的贴,将会被禁用账号!

  • 排版请按 Ruby China 的 Markdown 格式要求,具体请认真阅读: 排版指导,并参考 这篇招聘 的排版;
  • 招聘内容过少,缺少公司介绍,产品介绍,职位介绍,或待遇,工作地,联系方式等必要信息;
  • 重复发帖(一家公司每月限制只能发一次招聘);
  • 专业不对口(个别不对口,但有特点的,我们会放过);

如果你有时间,请阅读 招聘栏目详细说明


学会如何合理提问,请阅读:https://ruby-china.org/topics/24325

当你修改好以后,可以回帖 @huacnlee@Rei@lgn21st 任何一人,我们将会审核,通过以后才可恢复到其他节点。

注!多次发现广告嫌疑的帐号,将会被禁用帐号。

共收到 42 条回复

如果这是某家公司的面试题,这么做就是泄题,被面试官看到的话…

总结的不错,蟹蟹~

Rei 回复

所以是不能这样做?😂

Rei 回复

那我是不是改一下名字就行了😀

5楼 已删除

我改名字了,不那么敏感就行了吧,毕竟这些题目网上一搜一大把

chenyunli 回复

自己判断了,如果是我司的题我会让hr拉黑。

8楼 已删除
Rei 回复

。。。目的很单纯,就是面试了一圈,回来好好总结并记录一下而已。。。

我自从第一次发帖之后,就不太敢发帖了,因为总是要顾虑很多,感觉很莫名其妙~但是为了自己能在这里活跃一下,多和大神们交流,我又来了😨

11楼 已删除

屁大个事啊,即便是面试题,谁规定不能晒出来,拉黑就拉黑,who are you

13楼 已删除
chenyunli 回复
  1. 泄题让出题人构思一下午的笔试环节无效了。
  2. 在公司里,没允许公开的信息默认保密。(当然,顶楼情况也就进不去了而已)
Rei 回复

所以我应该一开始取个好名字。或者分类一下,然后分别取个名字再发帖比较合适吧。以后会注意。

国内某网站各大公司的面试题都像高考测试卷一样都分年份了

Rei 回复

因为如果不说是面试题,题目是 我遇到的 ruby 问题,这样就没人会觉得不妥了吧。毕竟还是想发布出去,和大家一起学习。

chenyunli 回复

圈子这么小,内容会被看到,为什么要把自己置身风险中呢?以前没人告诉你的话,不留意这个问题会阻碍你向更高发展。

😉 唯一风险就是可能会给其他面试者提供便利,正好准备找工作,顺便学习一下 = =

Rei 回复

不要吓唬小朋友了,这件事情,不同人,会从不同的角度思考问题的。想法不一定都和你一样

ane 回复

对,我是个人意见,也期待你把公司笔试题分享一下。

chenyunli 回复

我会因为你笔试题答的很烂,直接pass你,也会因为你笔试题答的不错和你多聊一些。这就好比相亲市场里,你长得好看一样,只是第一影响罢了。后面的关卡还有很多

Rei 回复

我想因为类似问题我几乎啥都不知道,所以该阻碍的都阻碍了

不要觉得“改个名字就可以避免被当作是泄题的纠纷”了。泄题就是泄题。

假如我为了避免自己设计的面试题被泄漏,在面试开始时就签保密协议,这会向面试人传达出一种“这家公司默认不怎么信任我”的潜台词,使面试人心理紧张,容易造成发挥失常。所以在:

  • 默认面试人会泄题于是要签协议施压
  • 默认面试人会在道义上坚持不泄题,不签协议可以使面试过程不那么紧张

两者间取舍,我是会选后者的。但话又说回来,假如面试一次就泄一次题,时间久了我也会觉得“既然面试过的都不值得信任那么还是签保密协议吧”。

类似的话题还包括上班要不要打卡,绩效考核要不要做(以及该如何做),代码上线是要由开发者自己灵活掌控还是搞层层验收签字制度(或者怎样找到折中的灵活又安全的制度)。如果合作中的双方能默认互相信任,解决问题的效率能高很多。

我觉得很奇怪,我就是想分享技术,在技术上多交流,根本没有去想这么多的问题。我想我还是不适合这里。如果我一个简单的初衷换来这么多的禁忌,我真是被吓到了。我不想在这些事情上分神,我只是想多学习一点知识。我真的很后悔自己发帖子在这里。在我的心里,只有好好的学技术,有什么技术问题大家一起分享,在我的心里,技术就是一片纯粹的土地,可是这里的言论,让我不知所措。没有一个人回复,我文章里面哪个技术是不是总结错了,或者哪里需要改进。而都是讨论这个,对于刚来 Ruby 社区不久的我来说,我真的是很悲伤。所以,宁愿做一个不说话的哑巴。也不想在这里关注我不想关注的问题。

其实我写之前,还专门搜索过 RubyChina 上有没有类似的帖子。我发现还是有类似面试题的话题的,大家并没有这样担忧啊。😭

chenyunli 回复

因为塞钱进谁的袋会看人啊。

chenyunli 回复

我真的觉得你学习态度很好,但是只限于技术,你可知道 @Rei 给你的提醒和建议价值远远大于你所分享的这些技术,在吐槽和抱怨之前,先学会三思和换位思考,分享技术没有问题,但是如果以后你还去面试其他公司,而如果人家知道你可能会分享面试中的细节,你觉得对方会怎么想?你自己在多想想?

lgn21st 回复

嗯。谢谢。

lgn21st 回复

我还需要很多别的历练。有什么错误,欢迎指正。谢谢你们,不断学习中

没必要这么公开讨论,管理员直接软删除,或移到 no point,

如果有联系方式,就私下提醒一下,这样不好,

没有联系方式,在 no point @ 一下,也不会有这么多人看。

楼主出发点是好的,做法有些不成熟而已。现在大牛都在忙事业,往往在学习的人更喜欢分享,应该保护这样的人。

Peter 回复

谢谢您的鼓励。本人还有待学习。还有很多不懂。有点不知所措。带来不好的影响,抱歉了。

chenyunli 回复

我自己移到 NoPint 里面吧。

Peter 回复

我自己移到 NoPint 里面了

@chenyunli 分享是没有错的,值得鼓励。但是分享有很多技巧,原文过于赤裸裸了,导向性很明显。换个角度,如果能够领悟这里边的基础知识,再就着其中某个点,写一篇 blog 去探讨会更好,比如就写一篇《Ruby 的方法寻找》。 另外楼上大家给你的建议不是为了打击你的积极性,而是为了帮助你用更恰当的方式去交流。

毕竟这些题目网上一搜一大把
我发现还是有类似面试题的话题的,大家并没有这样担忧啊。

表示下不赞同,很多人都做过的事情不一定就是对的事情,另外,做与不做,只是自己内心的原则而已。我认为泄题关乎诚信,轻重问题就见仁见智了。

martin91 回复

额,我真的不知道分享面试题关乎诚信。因为我自己认为的是,面试题可以作为去了解某一个细节知识的切入点。所以我觉得分享出去,大家有可能会针对这些问题做更多的了解。并没有知道也没有想到会影响到别的。因为我好几次发帖都引来争议,一度不敢过来发帖。这次来,又在自己的意料之外,所以,其实我一开始也并没有抱怨。我也想到应该拆分成一个个点去分享探讨比较好,所以我在前面回复的时候也有说。我想删掉文章,也没找到删除。Peter说可以放在NoPoint,我也马上移过去了。所以,很抱歉,是我自己经验不足。

分享技术, 没啥大问题, 放轻松~

我自己也有一套笔试题库的, 即使公开在网上, 我也不觉得会增加我面试候选人的难度; 如果候选人只是死记硬背, 两三句就问出来了; 如果候选人真得做了功课, 钻得挺深, 那不是好事儿么?

有些人觉得笔试题库是公司的资产, 不允许泄露, 那也很正常啊, 签保密协议就好了; 没有哪条职业操守, 行业规范或者法律条文, 规定了不允许分享笔试题; 没签协议, 还是不要把自己的意志强加给别人.

Ruby-China 是个友好的社区, 只不过网上交流看不到表情, 听不到语气, 有些话听起来很僵, 其实大家人都很 nice 啦

42thcoder 回复

😁 知道啦

支持你.泻个p的题啊.有签保密协议么?没签你说个dan啊.分享出来很好!支持.

我已经放在 NoPoint 中了。没事,他们说的也有理,之后注意就好了。

chenyunli 回复

很有帮助的,如果刚开始不是以泄密为开头的话

cqcn1991 回复

谢谢~

被打击的好惨,每个人有每个人的想法与意见把 我觉得这并没有什么

谢谢分享,是好的学习方向

这个没什么,死记硬背谁不会。面试更应该考的是举一反三。

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