当类型参数存在类型边界时,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 项目都在使用 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) 因此,我有一Game堂课,可以有很多Versions,每个课Version可以有很多GameStats。我有我的每个Version belongs_toa Game,每个GameStat belongs_toa Version和has_one Game通过Versions。在我的测试中,当我测试对game和version对象的响应以及对象相等性时,这些测试通过了,但是当我尝试通过调用引用对象时@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
我正在尝试在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) 创建自定义 ScalaFX 控件的正确方法究竟是什么?我来自 Swing 和 Scala Swing,其中自定义组件只是通过扩展Component或Panel. 但是当我尝试扩展 ScalaFX 时Control,如果没有 JavaFXControl委托,我就无法扩展它。我应该通过扩展基本 JavFX 类而不是 ScalaFX 类来创建自定义 ScalaFX 组件吗?
假设我们有一个与某个值相关的范围列表,比如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) 我想创建一个路径product/:id/monthly/revenue/,并product/:id/monthly/items_sold和等效命名路由product_monthly_revenue和product_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)