当我研究一个新的库时,我有时会发现很难找到一个方法的实现.
在Java中,Metho#getDeclaringClass提供声明给定方法的类.因此,通过迭代Class#getMethods,我可以找到每个方法,声明它的类.
在Scala中,traits被转换为Java接口,并且扩展trait的类将通过将它们转发到静态定义这些方法的伴随类来实现trait的方法.这意味着,Method#getDeclaringClass将返回类,而不是特征:
scala> trait A { def foo = {println("hi")}}
defined trait A
scala> class B extends A
defined class B
scala> classOf[B].getMethods.find(_.getName() == "foo").get.getDeclaringClass
res3: java.lang.Class[_] = class B
Run Code Online (Sandbox Code Playgroud)
解决这个问题的最佳方法是什么?意思是,给定一个类,我如何得到一个List [(Method,Class)],其中每个元组是一个方法,并且它被声明为trait/class?
考虑以下代码:
function Foo() {
}
Foo.prototype.alert = function() {
alert(this);
}
(new Foo()).alert();
Run Code Online (Sandbox Code Playgroud)
执行时(在jsfiddle中),警报显示'this'是窗口对象.将最后一行更改为:
var foo = new Foo();
foo.alert();
Run Code Online (Sandbox Code Playgroud)
按预期工作.
为什么有区别?
我有一个 2 列网格(实际上,有些行在其他 5 列网格中有 2 列)。我试图使第一个尽可能窄,并将其余的长度留给另一个。嵌套不起作用,因为我只有 2 列。
基本上,我想要类似col-xs-0.5
或更好的解决方案,该解决方案将使第一列足够宽以适合*
这是一个例子:https : //jsfiddle.net/4jcL24ze/8/
<div class="container">
<div class="row">
<div class="col-xs-1">*</div>
<div class="col-xs-11">some long description</div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud) 在Scala中定义main的常用方法(如下所示)可用于运行带有'scala'的类,但不能运行'java'(因为创建的方法不是静态的).如何编写可以用'java'执行的Scala类/对象?
object HelloWorld {
def main(args: Array[String]) {
println("Hello, world!")
}
}
Run Code Online (Sandbox Code Playgroud) 我想提供一个Scala演示文稿,我希望通过获取一个应用程序并将其从使用java成语的东西演变为使用scala(特征,模式匹配,隐式转换,函数编程)的东西.
我特别感兴趣的是能够展示设计变化的东西,而不是语法糖.最终scala代码显然更容易维护和扩展的东西.
那么任何想法?(我不是要求代码示例,而是要求使用什么示例和可以演示哪些设计原则的粗略想法).
代替
def foo(configuration: (String, String)*)
Run Code Online (Sandbox Code Playgroud)
我想能够写:
type Configuration = (String, String)*
def foo(configuration: Configuration)
Run Code Online (Sandbox Code Playgroud)
主要用例是在覆盖子类时提供简单的方法签名
更新:我可以靠近
type Param = (String, String)
def foo(configuration: Param*)
Run Code Online (Sandbox Code Playgroud)
但有没有办法做得更好?
这是我经常遇到的事情,但我不知道这种优雅的做法.我有一个Foo对象的集合.Foo有一个方法bar()可以返回null或Bar对象.我想扫描集合,调用每个对象的bar()方法,并在第一个返回实际引用时停止并从扫描返回该引用.
明显:
foos.find(_.bar!= null).bar
诀窍,但两次调用#bar.
我看到的大多数示例(如果不是全部)都是一种执行某种计算和完成的函数.在这方面,FP闪耀.但是,我很难看到如何在企业应用程序环境的上下文中应用它,在这种情况下,没有太多的算法进行,并且有大量的数据传输和服务.
所以我想问一下如何在FP风格中实现以下问题.
我想实现一个事件总线服务.该服务具有register
注册侦听器和publish
发布事件的方法.
在OO设置中,这是通过使用两种方法创建EventBus接口来完成的.然后,实现可以使用列表来保存由其更新register
和使用的侦听器publish
.当然这种方法register
有副作用.Spring可用于创建类并将其实例传递给事件的发布者或订阅者.
考虑到事件总线服务的客户端是独立的(例如,并非所有客户端都是以"测试"方法创建的),如何在FP中对此进行建模?据我所知,这否定了使寄存器返回EventBus的新实例,因为其他客户端已经拥有对旧实例的引用(例如,发布到它只会发布到它知道的侦听器)
我更喜欢在Scala中使用解决方案.
breakOut很好,但是太冗长了:
List(1, 2, 3).map{i => (i * 2, i / 2.0, i.toString)}(breakOut) : Array[(Int, Double, String)]
Run Code Online (Sandbox Code Playgroud)
我不想指定元素类型.我想要的东西:
List(1, 2, 3).map{i => (i * 2, i / 2.0, i.toString)}(build[Array])
Run Code Online (Sandbox Code Playgroud)
我可以buildArray
轻松地编写,但后来我需要一个buildSet,buildList等.所以我想要一些通用的东西.
额外点(;-))如果你可以使它适用于Map(使用相同的名称build
,而不是build2或buildMap)
当我将键盘布局切换为希伯来语并按下一个字符时,它会在按键事件中按原样接收.例如,单击?
(v键),然后e.which
是1492.但是,当我进行组合时,键是英语键.所以对于alt+?
e.which
是86.所以事件看起来像alt+v
这是一个痛苦,如果我想创建一个接受组合键和回调,并注册一个回调函数,但也显示了回调的文件,因为如果我注册alt+?
,然后当我按下组合它看起来像alt+v
,它不会匹配注册的组合.但是,如果我注册alt+v
,那么文档将是尴尬的.
所以我的问题归结为以下是否有可能:
?
用压在一起alt
而不是v
)alt+?
它时会将其转换alt+v
为回调查找.当然,我想要一些通用的东西,它适用于任何语言,而不仅仅是希伯来字母.