小编Sea*_*ean的帖子

Ruby 类名解析中的歧义

我最近在 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)

ruby ruby-on-rails

5
推荐指数
1
解决办法
573
查看次数

我如何创建一个返回True一段时间的IO Bool,然后再返回False?

今天我试图加深对IO monad的理解,并且我尝试编写一个函数,它接受Int n并返回一个IO Bool生成True n时间,然后False永远.

trueThenFalse :: Int -> IO Bool
Run Code Online (Sandbox Code Playgroud)

通常我会用递归来解决类似这样的事情,但是这里似乎没有任何东西可以递归.

我该如何实现这个功能?这样做是否可行和/或可取?

haskell

2
推荐指数
1
解决办法
231
查看次数

传播Scala类型参数

这是我认为人们通常想要在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].

是否有可能像这样任意传播类型信息?如果是这样,怎么样?或者我的期望太高,这是不可能的,这就是为什么我找不到任何例子?

scala

1
推荐指数
1
解决办法
69
查看次数

我可以拦截IE上的控制 - 按键吗?

我正在尝试使用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?

jquery events internet-explorer keypress

0
推荐指数
1
解决办法
1763
查看次数