小编Ben*_*Lee的帖子

Scala的类型推断如何与类型边界一起使用?

当类型参数存在类型边界时,Scala如何确定要推断的类型?例如:

def onMouseClicked_=[T >: MouseEvent](lambda: T => Unit) = 
  setOnMouseClicked(new EventHandler[T] {
    override def handle(event: T): Unit = lambda(event)
  })
Run Code Online (Sandbox Code Playgroud)

尝试使用此功能时,例如:

onMouseClicked = { me => doSomething() }
Run Code Online (Sandbox Code Playgroud)

me将具有推断类型MouseEvent.类型边界T是一个较低的类型边界,因此T必须是类型MouseEvent或超类型MouseEvent,所以为什么me有推断类型MouseEvent?它不应该推断出最普​​遍的类型吗?

是不是我不了解Scala的类型推断是如何工作的?或者我对类型界限的理解是完全错误的?

编辑:

假设我们进一步将T的类型限制为子类型Event,其中Event是超类型MouseEvent.所以我们得到:

def onMouseClicked_=[T >: MouseEvent <: Event](lambda: T => Unit) = 
  setOnMouseClicked(new EventHandler[T] {
    override def handle(event: T): Unit = lambda(event)
  })
Run Code Online (Sandbox Code Playgroud)

所以如果我们这样做

onMouseClicked = { me: MouseDragEvent …
Run Code Online (Sandbox Code Playgroud)

scala type-inference type-bounds

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

SBT:排除资源子目录

我的大部分 Scala 项目都在使用 Gradle,但我想评估 SBT 作为替代品的适用性。我在 Gradle 中所做的一件事是从最终构建中排除某个资源目录(例如,使用 CoffeeScript 编写将作为最终资源包含在内的 JavaScript 文件)。

在 Gradle 中,我会这样做:

sourceSets {
    main {
        resources {
            exclude 'com/example/export/dev' // exclude development resources
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将从com.example.export.dev最终构建中排除资源包包。

我将如何在 SBT 中做同样的事情?我试过了

unmanagedResourceDirectories in Compile -= (resourceDirectory in Compile).value / "com/example/export/dev"
Run Code Online (Sandbox Code Playgroud)

但这没有任何作用(我明白为什么,但这并没有真正的帮助)。SBT 网站上的文档只讨论了排除文件模式(在Classpaths、sources 和 resources 中)。

作为更具描述性的图像,假设我们有以下资源目录结构:

com
\---example
     \---export
         \---dev
         \---something
Run Code Online (Sandbox Code Playgroud)

在最终输出中,我想要:

com
\---example
    \---export
        \---something
Run Code Online (Sandbox Code Playgroud)

scala gradle sbt

5
推荐指数
2
解决办法
3864
查看次数

Rspec测试中nil类的未定义方法

因此,我有一Game堂课,可以有很多Versions,每个课Version可以有很多GameStats。我有我的每个Version belongs_toa Game,每个GameStat belongs_toa Versionhas_one Game通过Versions。在我的测试中,当我测试对gameversion对象的响应以及对象相等性时,这些测试通过了,但是当我尝试通过调用引用对象时@stats.game,得到了#<NoMethodError: undefined method 'game' for nil:NilClass>。我在这里很困惑,因为我可以@stats.game在rails控制台中进行操作,但是在某种程度上它在测试中不存在。

相关的模型代码在这里:

class Game < ActiveRecord::Base
  has_many :versions, dependent: :destroy
  has_many :platforms, through: :versions
  has_many :game_stats, class_name: 'GameStats', through: :versions

  validates :name, presence: true
end

class GameStats < ActiveRecord::Base
  belongs_to :version

  has_one :game, through: :version

  validates :version_id, presence: true
end

class Version …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails associations rails-models model-associations ruby-on-rails-4

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

在Scala中实现通用Vector

我正在尝试在Scala中实现一个通用(数学)向量,我遇到了一些如何正确执行它的问题:

1)你如何处理+和 - 这样操作a Vector[Int]和a Vector[Double]会返回Vector[Double]?简而言之,我将如何进行数字类型的自动推广(最好利用Scala的自动推广)?因为implicit n: Numeric[T]只有两个矢量的类型相同才能使用.

2)相关,我应该如何定义一个*操作,使它接受任何数值类型,并返回一个正确的数字类型的向量?也就是说,a Vector[Int] * 2.0会返回一个Vector[Double].

这是我当前的代码(它不像我想要的那样):

case class Vector2[T](val x: T, val y: T)(implicit n: Numeric[T]) {
  import n._

  def length = sqrt(x.toDouble() * x.toDouble() + y.toDouble() * y.toDouble())
  def unary_- = new Vector2(-x, -y)

  def +(that: Vector2) = new Vector2(x + that.x, y + that.y)
  def -(that: Vector2) = new Vector2(x - that.x, y - that.y)

  def *(s: ???) = new Vector2(x * …
Run Code Online (Sandbox Code Playgroud)

scala

4
推荐指数
2
解决办法
843
查看次数

创建自定义 ScalaFX 控件

创建自定义 ScalaFX 控件的正确方法究竟是什么?我来自 Swing 和 Scala Swing,其中自定义组件只是通过扩展ComponentPanel. 但是当我尝试扩展 ScalaFX 时Control,如果没有 JavaFXControl委托,我就无法扩展它。我应该通过扩展基本 JavFX 类而不是 ScalaFX 类来创建自定义 ScalaFX 组件吗?

scala scalafx

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

将缺失值插入列表

假设我们有一个与某个值相关的范围列表,比如a List[(Int, Int, Foo)].保证范围是不相交的,因此永远不会重叠.范围不包括给定字符串的整个范围.我想将每个Foo字符串与字符串的某些部分相关联,以便字符串可以拆分为(String, Option[Foo]).

我的想法是将其转换List[(Int, Int, Foo)]List[(Int, Int, Option[Foo])]每个缺失的范围都填写并与无关联.然后可以映射此新列表以将每个列表Foo与字符串的某些部分相关联.

一些具体的代码

case class Foo(i: Int)
val str = "a" * 99 // A random string of length 99
val input = List((5, 10, Foo(1)), (56, 60, Foo(2))
// ???
val filledInValues = List(
  (0, 4, None),
  (5, 10, Some(Foo(1))),
  (11, 55, None),
  (56, 60, Some(Foo(2))),
  (61, 98, None)
)
val res = filledInValues map { case (start, end, f) …
Run Code Online (Sandbox Code Playgroud)

scala

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

Rails在资源中嵌套范围块

我想创建一个路径product/:id/monthly/revenue/,并product/:id/monthly/items_sold和等效命名路由product_monthly_revenueproduct_monthly_items_sold,这些路由只会显示图表.我试过了

resources :products do
    scope 'monthly' do
        match 'revenue', to: "charts#monthly_revenue", via: 'get'
        match 'items_sold', to: "charts#monthly_items_sold", via: 'get'
    end
end
Run Code Online (Sandbox Code Playgroud)

但这给了我路线:

product_revenue    GET    /monthly/products/:product_id/revenue(.:format)    charts#monthly_revenue
product_items_sold GET    /monthly/products/:product_id/items_sold(.:format) charts#monthly_items_sold
Run Code Online (Sandbox Code Playgroud)

其中monthly在前面被所附代替,以及路线命名是关闭的.我知道我可以这样做:

resources :products do
    match 'monthly/revenue', to: "charts#monthly_revenue", via: 'get', as: :monthly_revenue
    match 'monthly/items_sold', to: "charts#monthly_items_sold", via: 'get', as: :monthly_items_sold
end
Run Code Online (Sandbox Code Playgroud)

但这不是DRY,当我尝试添加更多像年度这样的类别时会变得很疯狂.当我想将所有图表合并到一个控制器中时,使用命名空间会强制我为每个命名空间创建一个新控制器.

所以我想总结的问题是:是否可以在没有namspacing控制器的情况下命名路由?或者是否可以合并命名路线类别的创建?

编辑:使用

resources :products do
  scope "monthly", as: :monthly, path: "monthly" do
    match 'revenue', to: "charts#monthly_revenue", via: …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-routing ruby-on-rails-4

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