Ruby 里说到的继承就是指 class A < B
这种语法结构,和 mixin 不同... 当多继承用只是 mixin 的一个用途而已,但是这个 "多继承" 和 Ruby 语法里的 "继承" 不是一回事,这么讲会产生混淆的...
调 super
的一个问题就是菱形继承
module A
def initialize
puts 'a'
end
end
module B
include A
end
module C
include A
def initialize
puts 'c'
end
end
class D
include C
include B
def initialize
super # 明显? 谁记住父类方法查找是深度优先还是广度优先?
end
end
另一个隐患是 open class, 在上面的代码之外,再加上这个:
module E
def initialize
puts 'e'
end
end
class D
include E
end
如果这两段代码载入顺序不同,结果也不同...
当有多个 "上一层" 的时候,super 的语义就很牵强了
class C < B
include N
include M
end
mixin 更倾向于用组合 (composition) 而非继承的方式去理解问题,例如:
module Hand
end
module Leg
end
module Doll
include Hand
include Leg
end
Hand 是 Doll 的一部分,你偏要说 Doll 继承了 Hand 不就很奇怪么...
毕竟 mixin 不是继承,当又有 include 又有继承的时候,super 调到哪里就比较难弄清楚了
笨办法:把 N 的初始化改个名字
module N
attr_accessor :v
def init_n
@v = ...
end
end
class C
include N
def initialize
...
init_n
...
end
end
可能需要 bundle exec rails
或者 NOEXEC_DISABLE=1 rails
哪个好用加个 alias 就好了
nil 判断可以去掉,因为 nil 必然不是 Array
文档数据库很简单:要查什么样的结果,就存什么
coffee 里需要暴露到全局作用域的东西,用 window
window.divover = (flag) ->
...
大概是选择器写错了,应该是 $("#send_message")
或者 $(".send_message")
?
或者是 render 参数有问题?
matz 用的是高桥流 http://book.douban.com/subject/4326862/
主要内容在讲的部分...
我试了下,都放到 public 目录下,没问题啊
建议检查下 xsl 的文件名
必须加个条件:"有 Java 基础时", RoR 才很难学...
命名也很重要...
同一个颜色 屎黑色 摩卡色 然后档次就上来了
#35 楼 @rasefon IO 完全不关语言的事啊... 难道不是操作系统或者网络的问题?有具体代码或者例子么?
#36 楼 @bhuztez 不知道,大概是 python vm 里指定了 register modifier 的变量影响了流水线,导致空跑几个时钟周期之类的... 具体只能 micro benchmark 单个指令了吧...
JIT 比解释慢没什么好奇怪的,java 1.1 刚加 JIT 的时候是默认不开的,因为开了反而更慢...
erlang 生成了什么样的 byte code 也不知道啊,或许发现这个函数是 pure recursive 的把 memoize 应用上了...
... 这样... ?
O = Object.new
def O.foo
'foo'
end
K = Object.new
def K.foo
O.foo
end
python 是取 attr 再 apply, non-method attr 没有 cache 的意义,估计就是 inline method cache 的区别了...
如果在 ruby 源码的 vm_opts.h 里把这些优化选项改成 0 关掉:
#define OPT_INLINE_METHOD_CACHE 0
#define OPT_GLOBAL_METHOD_CACHE 0
再 make install
应该可以更接近 python3 一点...