尽量不要用 Ruby 的保留字来定义变量方法之类,这不是一个程序员该干的事。
这是微博上有人传的图
@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 真灵活!
@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 也没啥区别。但是如果了解这个实质,大家也不会有那种困扰了,但是为了代码的可读,使用你的方法很好。总的来说,和你讨论,受益良多。
让自己犹豫不决的地方就不用去了。
对于 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 中添加其他的变量。
这个薪资水平在直布罗陀是个什么水平?那边消费如何?这个得给大家伙说说
#13 楼 @keyboarder 再说明一下,视频的难度是由入门 -> 基础 -> 进阶 -> 高级这样一个顺序的,你可以按这个顺序来学习。
真的很不错
#13 楼 @keyboarder 感谢支持。51cto 的视频需要上传以后现在需要一个编码转换,这个过程大概两天的时间才能完成,所以大概是两 - 三天。进阶的视频,我录了五课时(基础篇),后面的正在录,暂时收费观看。
作为公司一方,肯定是有对于一部分人可以当面给予结果的,就是那些很优秀或者是很差劲的。另一部分人,让其等通知,是不是可以称为备胎呢?但一般会给一个期限。所以别抱怨面试的公司,还是努力提升自己吧。
这个众筹网站也是用了别人的开源搭建的吧