ruby问题总结

  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

  1. 描述 object, class, module 的关系是什么,并画图表示。
    从继承关系来说,是Class --> Module --> Object,即Object是继承树的顶层,紧接着是Module,然后是Class。
    Modules, Classes, and Objects

  2. 为什么在 model 中可以调用 validates,自己怎么实现 model 中的 validates,试着实现一下?

    validations

  3. 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?(判断数组中元素是否为空)。
    而通常情况下,不带感叹号的方法返调用该方法的一个拷贝,带感叹号的方法则是一个可变方法,该方法会修改原来的对象,如Array类中的sort和sort!

  4. rails 源码

  5. rails 本身是由什么组成的?
    Rails组成和项目结构
    10.《ruby 元编程》

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

  7. 不使用 ActiveJob,sidekiq 单独使用可以不?
    Active Job 和 Sidekiq 简介
    Active Job
    Rails: 使用Active Job来处理异步任务

  8. bundler 和 gem 的关系?bundler 是 gem 么?
    bundler
    Rvm 与 Bundler 的爱恨情仇
    RVM,RubyGems和Bundler的日常使用

  9. passenger, nginx, 还有一个是什么,忘记了,这三个各自干什么的,怎么结合起来一起工作,缺一可以不
    Ruby 服务器对比

  10. 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]
    
  11. find 和 find_by 的区别
    rails中find/find_by/where的区别

  12. 解决 N+1 Query 的方法有哪些
    浅谈 ActiveRecord 的 N + 1 查询问题
    Rails使用include和join避免N+1 queries

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

  14. rack 是什么
    Rails on Rack

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

    对于CSRF:Cross Site Request Forgery,跨站请求伪造。通俗理解:攻击者盗用当前用户身份,发请当前用户的恶意请求:如邮件,银行转账等。

    对策:首先,根据 W3C 的要求,应该适当地使用 GET 和 POST HTTP 方法。其次,在非 GET 请求中使用安全令牌(security token)可以防止应用受到 CSRF 攻击。

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

  17. Rails: pluck与select的区别

  18. 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
    
  19. scope 的实现原理
    核心是延迟计算,将where、order、limit子句变为Relation对象,然后在最终调用each/to_a时组装sql

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,448评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,648评论 3 406
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,816评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,288评论 1 304
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,294评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,739评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,076评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,071评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,632评论 1 327
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,637评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,755评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,344评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,069评论 3 341
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,487评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,646评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,342评论 3 384
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,813评论 2 367

推荐阅读更多精彩内容