• 都是好书。谢谢小姐姐~

  • 嗯。受教了,等我积累一段时间可以考虑试一试,还能多拿个证,挺好。

  • 谢谢前辈!

  • 哈哈!这个思路挺新颖,一举两得。

    记得大学时,我们学校报考的二级都是 C 语言,当时为了考的容易一些,特意跑到隔壁一个师范学校报了一个 Access 数据库,还嘚比嗖嗖地给一起考试的小姑娘传答案(后来坑蒙拐骗取了其中一个小姑凉。。。)

    考二级的时候,内心的 OS 是,以后我可不要当程序员!结果兜兜转转还是做了程序员。。。

  • 厉害!膜拜中🙏

  • 谢谢推荐!

  • 非常全面!谢谢前辈!

  • 前辈您这指导相当生动接地气儿啦!(红黑树那段我笑出了声)

    就像前辈说的,时间和精力真的是感觉越来越不够用了,可能看一个框架一个月能基本上手干活,但是看一个月算法可能门儿都没入,大多时候迫于工作出结果就选择了前者。所以,对于坚持这个事,我真不敢夸下海口。现在被逼得每次上大号都会多上十分钟,在里面看算法书。。。

    但不管怎么说,我还是要挑战一下自己,不以面试为目标,也不以炫技为目标,就为了不给自己的程序员生涯留下遗憾。(决心表完了,嘿嘿~)

    感谢前辈愿意花时间码字指导!(敬礼~)

  • 前辈介绍的很具体,最后的总结也很有指导性。

    算法引论这本书之前自己了解过一些,觉得很有启发性,但是一问算法,大部分人都推荐算法第四版还有算法导论这两本,前辈的分析让我肯定了对算法引论这本书的选择。谢谢!

  • 谢谢!

  • 很全面,多谢!

  • 非常感谢!

  • 不太明白为啥 node 圈里 express 和 koa 这么受推崇,我记得当年学习后端的时候比来比去,觉得 hapi 最完善,所以毅然从 hapi 入手,现在想想,当时幸好没从 express 入手,要不然肯定学的七零八碎的。

  • 为了写博客特意自己搭了一个,结果搭完了一篇还没写。。。用啥写真的不重要

    https://oatw.blog

  • 我来回答自己的问题了,忘记加 false 参数了,所以在调用 self.singleton_class.private_instance_methods 的时候把 Object 上的方法也查找了。。。

    这样就好了

    p self.singleton_class.private_instance_methods(false).grep(/^global_method/)  # => []
    

    谢谢前辈的指点!

  • 你是对的!顶级作用域下直接定义方法是在 Object 上定义私有实例方法 (相当于打开类定义实例方法),如果明确在 self 上定义方法,才是在 self 的单件类上定义方法(相当于自定义对象上定义方法的语法 def obj.some_method; end),是我的理解不准确。

    但是我在下面的代码里又出现了一个小疑问,还麻烦指点一下,谢谢了!

    def global_method
    end
    
    p self.singleton_methods.grep(/^global_method/)  # => []
    p Object.private_instance_methods.grep(/^global_method/)  # => [:global_method]
    
    def self.global_method2
    end
    
    p self.singleton_methods.grep(/^global_method/) # => [:global_method2]
    
    
    # 这里就有个疑问了,在self单件类上咋还有global_method这个方法呢?
    p self.singleton_class.private_instance_methods.grep(/^global_method/) # => [:global_method]
    
    p self.singleton_class  # => #<Class:#<Object:0x00000000003ba290>>
    
    
  • 是不是用 credentials 好一点,省去配置各种环境变量的麻烦,如果不得不用环境变量的话,请人工忽略此回复。。。

  • 不不不,程序员都挺聪明的,我只是多了点细心,嘿嘿~

  • 官方文档我没怎么翻,我是先看的书,一本叫做《Ruby 元编程》的书,书里给到的继承图谱是一些比较核心部分的,我在网上也没搜索到全面的(可能有,我没发现),所以上面那个图是我在 irb 里根据各个对象打印出来的祖先链画出来的。。。

  • 大部分人还是停留在应用的层面,可能也没必要太深入的研究,但是不能否认基础好的人对技术的领悟力更强。所以我觉得如果自己需要进阶,计算机基础还是需要恶补的。

  • 因为我不是学计算机出身的,自己的计算机基础也比较薄弱,所以只是在用一些自己觉得比较好理解的笨方法来理解和记忆,兄弟你的阐述我大致看明白了,怎么说呢,就是有一个自己最熟悉的概念模型能帮助自己最好的理解就可以了。我的计算机基础还需加强。

  • 兄弟,我对你的问题的理解有两种。

    1.顶级作用域下的单件方法

    Ruby 顶级作用域就是在 Object 内部,self 默认指向一个 Object 的特殊实例 -> main 对象,在调用方法的时候其实调用的是 main 对象的单件方法, updated_begin: 在调用方法的时候实际上生效的是 Object 的实例方法,但是如果在 self 上显示添加了单件方法,比如像这样 def self.method_name; end, 那么在调用这个单件方法时,就是在其单件类上查找到的 updated_end,查找方法的完整祖先链是:

    self.singleton_class.ancestors # => [#<Class:#<Object:0x00000000004ea2c8>>, Object, Kernel, BasicObject]
    

    (其实整个的原理跟在 class 关键字内部定义方法和打开单件类定义方法的原理是一样的,是我一开始没理解好,这里做了修改。)

    2.所有对象的单件方法

    Ruby 中一切皆对象,按照继承链图谱,要保证所有对象都有某个可被调用的单件方法的话,那么这个单件方法可定义的地方不只一处,可以在 BasicObject 中、Kernel 中、Object 中定义为实例方法。

    另外, 如果有 java 背景更强调类的概念,@spike76 兄弟给你的回答应该是更容易理解的。

    我在学习 Ruby 的过程中感觉类和对象的界限不是绝对的,类也是对象,对象也有可能是个类,如何区分应该是看它当前扮演的角色,或者说我更倾向于用单件类的概念来理解对象的方法,在 Ruby 中对象的方法是按照其单件类继承链来查找的

    (ps:我是初学者,如果有前辈发现有描述错误的,请指正,免得我误导了别人,谢谢!)

  • 很有道理咧!多谢兄台!

  • 非常感谢!看到白板类三个字不由自主地激灵了一下子,有点开窍了。

  • 前辈,我为了证明,写了一小段代码,从输出结果来看,我的推测应该是对的呀。

    module Kernel
      def print(arg)
        p 'instance method print of Kernel'
      end
      class << self
        def print(arg)
          p 'singleton method print of Kernel'
        end
      end
    end
    
    class Foo
      print "" # => "instance method print of Kernel"
    end
    

    虽然 Kernel 的 instance method print 和 singleton method print 都是同一个 print 方法对象,但是我还是没能通过你的例子理解 Kernel 中 singleton methods 中和 instance methods 中重名方法的使用场景。我是不是有点笨。。。😟

  • 在定义 Foo 这个 class 调用 print 的时候,self 指向 Foo,Foo 相当于一个实例,那这个 print 应该是查找它的类中的实例方法 print,祖先链走的应该是#MyClass(#Foo)这条,会在 Kernel 中找到 print 方法,但 Kernel 中找到的这个 print 是 Kernel 的 instance method 不是 singleton method 中的 print 呀。我的理解对不对呀。

  • bootstrape-sass 如何快速开发 at 2019年07月08日

    大兄弟别客气,每个人都有自己擅长和不擅长的领域,我也是个 Rails 小白人,Ruby China 的绝大多数前辈都很友好,祝你学的开心,找到乐趣。

  • bootstrape-sass 如何快速开发 at 2019年07月05日

    不客气。

    如果大量依赖 UI 编辑器生成的 css,那可以武断点讲,已经失去了使用 bootstrap-sass 这类 gem 的意义了,个人认为之所以要用这类 gem,更多的就是要使用 sass 的特性。所以,如果用 UI 编辑器的话,建议只用在一些不会怎么变化,可复用的 partial 上。

    关于后续的问题有点混乱(我的理解力不太行),我感觉不太好回答呀大兄弟!更多的还是你自己的思路,想用什么方式来组织前端的资源?更愿意写 scss 还是 sass 还是 css?这些得先考虑清楚。我的建议是:

    scss 语法兼容 css 语法,而且很多资源管理工具会对文件后缀名进行解析并串联不同的 processor,但从资源管理的角度来看,大多数情况下理智的选择是什么类型的文件就用什么样的后缀,然后从引入方式上来区分,这样不至于以后维护的时候被自己绕晕。具体的可以复习一下 sass lang,Rails asset pipeline 或者 webpack 之类的文档,回忆起工作原理后就清晰了。

  • bootstrape-sass 如何快速开发 at 2019年07月05日

    bootstrap4 的 gem 是 [https://github.com/twbs/bootstrap-rubygem], 2,3 的 gem 是 bootstrap-sass,但是原理上差不多。

    1. 看源码可以发现核心内容主要有两大部分构成。

    对于 bootstrap 的 sass 文件还有 js 文件等其他静态文件,是通过 http 请求从官方 repo 上抓取到 gem 的 assets 目录里。

     # 部分源码
    
    def initialize(repo: 'twbs/bootstrap', branch: 'master', save_to: {}, cache_path: 'tmp/converter-cache-bootstrap')
      @logger     = Logger.new
      @repo       = repo
      @branch     = branch || 'master'
      @branch_sha = get_branch_sha
      @cache_path = cache_path
      @repo_url   = "https://github.com/#@repo"
      @save_to    = {
          js:    'assets/javascripts/bootstrap',
          scss:  'assets/stylesheets/bootstrap',
          fonts: 'assets/fonts/bootstrap'}.merge(save_to)
    end
    
      def get_file(url)
        uri = URI(url)
        cache_path = "./#@cache_path#{uri.path}#{uri.query.tr('?&=', '-') if uri.query}"
        FileUtils.mkdir_p File.dirname(cache_path)
        if File.exist?(cache_path)
          log_http_get_file url, true
          File.read(cache_path, mode: 'rb')
        else
          log_http_get_file url, false
          content = open(url).read
          File.open(cache_path, 'wb') { |f| f.write content }
          content
        end
      end
    

    另外一部分其实最主要的就是bootstrap-sass.rb这个文件,里面定义了在不同环境下(Rails,Hanami, Sprokets,Sass)自动添加静态资源 load path 的方法。

     # 部分源码
    if rails?
      register_rails_engine
    elsif hanami?
      register_hanami
    elsif sprockets?
      register_sprockets
    elsif defined?(::Sass) && ::Sass.respond_to?(:load_paths)
      # The deprecated `sass` gem:
      ::Sass.load_paths << stylesheets_path
    end
    

    所以,第一个问题简单来说:bootstrap-sass = bootstrap 资源文件 + 自动添加资源 load path

    2.umm..其实一步一步对着文档开发挺慢的,最好还是把文档好好熟悉一遍,常用的组件怎么组合标签,常用的 class 都是什么作用,这些要很熟悉,这样就可以自己按需使用了。至于可视化 UIi 编辑器生成的代码如果要修改,还是要熟悉 bootstrap 的,要不然也不知道咋改。图快的话还可以买theme...

  • 有人用过 hanami 吗? at 2019年07月04日

    没用过,目测对前端静态资源的打包支持还不是太完备,2.0 版本前如果需要比较完备的前端构建工具,需要自己来集成,然后就放弃了。。。按照作者的说法是更倾向于一个后端的框架。

    社区有人做了第三方的hanami-webpack,但仍处在实验性阶段。

    2.0 版本貌似会有很多变更,目前观望中。 https://discourse.hanamirb.org/t/hanami-2-0-ideas/306