• 尽量不要用 Ruby 的保留字来定义变量方法之类,这不是一个程序员该干的事。 👎

  • 据说这个截图很牛逼 at 2013年07月26日

    这是微博上有人传的图

  • 据说这个截图很牛逼 at 2013年07月26日

    @luikore 这是 Erlang,c10m,1000w 连接占 60 多 G 内存。

  • 看了以后感觉确实应该在国内没什么人用它 😄

  • controller 层面加个权限管理

  • 我也说一个吧:

    团 800,N 年前去面试过,当时他们还只有一个小办公室,忘记是谁面试我了,好像是 CTO。问的是一个概率问题,题也忘记了,说实话,概率在学校的时候,考试基本难不到我。但是面试的时候,可能我有点紧张,又感觉有点遗忘概率的公式,想了半天做不出来。然后那个 CTO 就跟我说:以你的水平恐怕难以理解我们的业务啊。我只能呵呵一声,就退出了办公室。以后看见团 800 的招聘贴,就躲着走,心理有阴影了 😰

  • 在使用 include Mix-in 模块的时候,确实存在顺序问题,但也无法改变 Mix-in 是多重继承这个事实啊。

    在 Ruby2.0 里新增的 prepend 方法(组合的概念怎么理解这个?),是可以把一个 module 变成类的子类的(在继承树关系上)。

    所以,说的更精确一点就是: Ruby 中用 Mix-in 操作继承树来解决多继承的问题,正如 Matz 所说,Mix-in 让多继承的类结构变的简单了可以很确定的说,Matz 设计 Mix-in 的这种机制,就是为了让程序员可以像单继承那样去使用多继承

    至于你怎么利用 Mix-in,那就是你自己的事情了。

    [增加 prepend 的代码]

    
    
    class Foo
      def do_stuff
        puts "doing stuff"
      end
    end
    
    module Wrapper
      def do_stuff
        puts "before stuff"
        super
        puts "after stuff"
      end
    end
    
    class Foo
      prepend Wrapper
    end
    
    Foo.new.do_stuff 
    
    
  • @simlegate @alan90121 你俩人的回答真诡异。 [修改] define_method 是定义的 initialize 方法啊。 instance_eval 可以在 api 里去看看说明:http://ruby-doc.org/core-2.0/BasicObject.html#method-i-instance_eval Evaluates a string containing Ruby source code, or the given block, within the context of the receiver (obj).

    是在 receiver 的上下文执行一段文本。

    在 module 里用那个 instance_eval 实际上只是用了 included 回调方法,而 initialize 方法是定义到 Class C 里面的。这样的话,就和我 1 楼的例子不是同一个概念了,因为@meeasyhappy的方法是在 include 的时候利用回调函数动态定义了方法。

    不得不再一次感慨,Ruby 真灵活!

  • #24 楼 @jjym 讨论没有对错。只要能把正确的东西传达出来就行。

    @luikore 的那种解决方案在避免 moudle 混入时候出现对于开发者的困扰。 而我是从另一个角度来说 Mix-in。

    也没有谁对谁错。看大家怎么理解吧。

  • @jjym 好吧,随便你怎么理解吧。我也不是和谁去辩论和抬杠。

    那你告诉我语义上 MixIn 是什么,组合?组合该怎么理解,你如何写出一个组合的代码?组合如何求解 @luikore 所说的那种菱形问题?

    再一个,我说的是多重继承,不是继承(单继承那种继承,Ruby 里说的继承是指单继承)。是 Matz 的《松本行弘的程序世界》里告诉我的,Matz 不会写书瞎说吧?

    所谓的混乱,只是在使用的时候,我们自己把自己搞混。你们说的组合,只是编程方法而已。把 initiliaze 方法换成 init_n,只是在可读性,维护性上更好了,我也认同@luikore的那种写法。我只是在说明 Mix-in 的行为是什么,而@luikore说不是多继承,如果不是多继承,他的例子里 class C 的 initialize 方法中调用的 init_n 哪来的?本身多继承和单继承其实也是同一个概念,就是继承嘛。

    ActiveSupport::Concern 这种东西是 Rails 里实现的语法糖。

  • #20 楼 @luikore 首先,我说的是多重继承,不是继承(单一),是两个概念。

    D.ancestors => [D, B, C, A, Object, PP::ObjectMixin, Kernel, BasicObject]

    使用 ancestors 方法,可以看到方法查找的顺序,super 肯定是调用 C 的方法。

    如果再加一个 E module,同样,D.ancestors 可以看到: [D, E, B, C, A, Object, PP::ObjectMixin, Kernel, BasicObject]

    这次是调用 E 类的方法。

    这和载入顺序没有关系,是和 ancestors 以及方法查找有关系的。

    当你看到 ancestors 继承树,难道还能被所谓的菱形问题困扰吗? 这方面,可以参考《松本行弘的程序世界》一书中,Matz 对 Mix-in 的论述。

    我明白你说的,咱俩说的是两个层面:一个是语言实现的本质,mixin 要解决的问题,一个是你作为程序员该如何使用,毕竟你把 initialize 方法换个名字 init_n 和 super 也没啥区别。但是如果了解这个实质,大家也不会有那种困扰了,但是为了代码的可读,使用你的方法很好。总的来说,和你讨论,受益良多。

  • #17 楼 @luikore 当然,我可以理解,你在 15 楼的方案,以“组合”的概念解决问题很漂亮。 我比较认同你,“组合”思维来组织代码,来使用 Mix-in。 但 Mix-in 的本质还是多继承。

  • #17 楼 @luikore 奇怪啥,再复杂的组合,使用 ancestors 就知道 super 继承自哪了。

    module Hand end

    module Leg end

    module Doll include Hand include Leg
    end

    class A end

    class B < A include Doll end

    B.ancestors #=> [B, Doll, Leg, Hand, A, Object, Kernel]

    不是继承是啥?请问哪里牵强?Matz 自己都说了,Mix-in 是实现了多继承,啥叫组合? 请问你组合的思维如何理清他们的关系?

  • #15 楼 @luikore 哥们,Mix-in 是 Ruby 实现多继承的方式,super 的调用肯定是上一层的同名方法了(include 的那个模块),怎么会不知道调用到哪呢?在同时有继承的时候,可以查看一下那个类的 ancestors 方法,就可以知道继承关系了。

  • 很纠结去不去这个公司 at 2013年07月25日

    让自己犹豫不决的地方就不用去了。

  • 对于 yehuda 那种大师,就好像一位气功大师对你说,气功就是所谓的‘气’。你怎么理解‘气’这个概念,应该是对深入了解以后才明白,所谓的‘气’原来是个总结归纳。所谓的“self”也一样。

    我觉得理解元编程,应该从三个方面来: 1 理解 ruby 的方法调用,实际上就是一个消息传递,self,就是指 receiver,你应该知道什么情况下,谁是那个消息的 receiver。 2 方法调用链。你应该了解 Ruby 中方法寻找的过程。 3 理解 Ruby 中的对象模型以及单例类,了解 Ruby 内建的方法哪些是操作单例类的,比如 extend,我们可以从 api 文档里面就看到了,它是操作单例类的。

    从以上三个层面着手,到最后你也会得到一个归纳总结的结论,self。

  • [修改] @meeasyhappy 的方法挺妙。

  • @simlegate 如果你不想 module 和 class 之间有很紧密的关系,只能重新开发设计一款 Ruby 了。XD

  • @simlegate module 和 class 的关系就是 class 继承了 module,不太明白你说的“不想 module 和 class 之间有很紧密的关系”,而且我的方法,也不依赖于 C class 啊,你可以把初始变量都放到 module 里面,C class 里面可以放只是和 C 相关的初始变量,M 里面放公共的初始变量,假如你还有个 Class D,include M 之后,也可以使用@v

    「补充」:如果你用@meeasyhappy那种方式,利用了 included 回调来动态定义方法,除外。

  • 首先你应该明白,module 是 Ruby 中实现多继承的一个方式。 既然是一个继承,那么可以这样:

    module N attr_accessor :v

    def initialize @v = "hello" end end

    class C include N def initialize super end end

    c = C.new c.v

    class C 里面的 initialize 方法可省,这里是为了说明,你还可以在 class C 中添加其他的变量。

  • 这个薪资水平在直布罗陀是个什么水平?那边消费如何?这个得给大家伙说说

  • Ruby 学习视频教程 at 2013年07月24日

    #13 楼 @keyboarder 再说明一下,视频的难度是由入门 -> 基础 -> 进阶 -> 高级这样一个顺序的,你可以按这个顺序来学习。

  • 真的很不错

  • Ruby 学习视频教程 at 2013年07月24日

    #13 楼 @keyboarder 感谢支持。51cto 的视频需要上传以后现在需要一个编码转换,这个过程大概两天的时间才能完成,所以大概是两 - 三天。进阶的视频,我录了五课时(基础篇),后面的正在录,暂时收费观看。

  • 作为公司一方,肯定是有对于一部分人可以当面给予结果的,就是那些很优秀或者是很差劲的。另一部分人,让其等通知,是不是可以称为备胎呢?但一般会给一个期限。所以别抱怨面试的公司,还是努力提升自己吧。

  • 这个众筹网站也是用了别人的开源搭建的吧

  • #5 楼 @zealinux 我的意思是从 0 开始去思考