我最近在 Rails 代码库中进行了一些代码重构,其中我转换了一些定义这样的类的代码(类主体被省略):
foo/user_bar.rb:
module Foo
class UserBar; end
end
Run Code Online (Sandbox Code Playgroud)
foo/sub_user_bar.rb:
module Foo
class SubUserBar < UserBar; end
end
Run Code Online (Sandbox Code Playgroud)
...到:
在foo/bar/user.rb:
module Foo
module Bar
class User; end
end
end
Run Code Online (Sandbox Code Playgroud)
在foo/bar/sub_user.rb:
module Foo
module Bar
class SubUser < User; end
end
end
Run Code Online (Sandbox Code Playgroud)
这引入了一个微妙的问题,因为已经有一个名为User(Rails 模型)的现有顶级类,并且SubUser是从它派生的,而不是来自User同一模块。我猜这是因为 Rails 加载类的顺序是不可预测的......?
无论如何,我发现我可以通过SubUser像这样声明类来消除歧义:
class SubUser < self::User
Run Code Online (Sandbox Code Playgroud)
...这似乎有效,虽然我在适度的搜索中找不到任何例子。不过,它看起来确实有点奇怪。现在我担心我真的应该为模块中的每个类都这样做,以防万一引入了同名的顶级类。
我公司的代码库中有两种类型的模块内类声明:
class A::B::Foo; end
Run Code Online (Sandbox Code Playgroud)
和:
module A; module B; class Foo; end; end; end …Run Code Online (Sandbox Code Playgroud) 今天我试图加深对IO monad的理解,并且我尝试编写一个函数,它接受Int n并返回一个IO Bool生成True n时间,然后False永远.
trueThenFalse :: Int -> IO Bool
Run Code Online (Sandbox Code Playgroud)
通常我会用递归来解决类似这样的事情,但是这里似乎没有任何东西可以递归.
我该如何实现这个功能?这样做是否可行和/或可取?
这是我认为人们通常想要在Scala中做的事情,但是如果我能在任何地方找到一个例子我就该死.
由于类型擦除,此代码无法编译,但它演示了我正在尝试完成的任务:
def parse[T](json: JsValue): T = {
json.validate[T] match {
case JsSuccess(x, _) => x
case JsError(errors) => throw new MyException(errors.toString)
}
}
Run Code Online (Sandbox Code Playgroud)
我看到类型信息从擦除中保留的方式是添加一个隐式ClassTag参数:
def parse[T](json: JsValue)(implicit ct: ClassTag[T]): T = {
json.validate[T] match {
case JsSuccess(x, _) => x
case JsError(errors) => throw new MyException(errors.toString)
}
}
Run Code Online (Sandbox Code Playgroud)
但是......现在怎么样?如果该validate方法采用ClassTag参数,我想我可以直接传递它:
json.validate(ct)
Run Code Online (Sandbox Code Playgroud)
...但它没有,它需要隐含的Reads[T],我无法辨别如何从a ClassTag[T]到a Reads[T].
是否有可能像这样任意传播类型信息?如果是这样,怎么样?或者我的期望太高,这是不可能的,这就是为什么我找不到任何例子?
我正在尝试使用jQuery拦截我的网页上的控件 - 一个按键,如下所示:
$(document).keypress(function (event) {
if (event.ctrlKey && (event.which == 65 || event.which == 97)) {
event.preventDefault();
// ...
}
});
Run Code Online (Sandbox Code Playgroud)
这适用于Firefox,但在IE7上,我的事件处理程序不会被调用,而且页面上的所有文本都会被选中(就像在没有事件处理程序的Firefox上一样).
有什么方法可以拦截IE上的控件-A?