在Scala中,您可以使用模式匹配来生成结果,具体取决于输入的类型.例如:
val title = content match {
case blogPost: BlogPost => blogPost.blog.title + ": " + blogPost.title
case blog: Blog => blog.title
}
Run Code Online (Sandbox Code Playgroud)
在C#中,我最好能够写:
var title = Visit(content,
(BlogPost blogPost) => blogPost.Blog.Title + ": " + blogPost.Title,
(Blog blog) => blog.Title
);
Run Code Online (Sandbox Code Playgroud)
这可能吗?当我尝试将其作为单一方法编写时,我不知道如何指定泛型.以下实现似乎是正确的,除了让类型检查器允许接受T的子类型的函数:
public TResult Visit<T, TResult>(T value, params Func<T, TResult>[] visitors)
{
foreach (var visitor in visitors)
{
if (visitor.Method.GetGenericArguments()[0].IsAssignableFrom(value.GetType()))
{
return visitor(value);
}
}
throw new ApplicationException("No match");
}
Run Code Online (Sandbox Code Playgroud)
我最接近的是将函数单独添加到对象,然后调用访问值:
public class Visitor<T, TResult>
{
private class Result …Run Code Online (Sandbox Code Playgroud) 我使用"scope"创建了一个带有绑定的指令.在某些情况下,我想绑定一个常量对象.例如,使用HTML:
<div ng-controller="Ctrl">
<greeting person="{firstName: 'Bob', lastName: 'Jones'}"></greeting>
</div>
Run Code Online (Sandbox Code Playgroud)
和JavaScript:
var app = angular.module('myApp', []);
app.controller("Ctrl", function($scope) {
});
app.directive("greeting", function () {
return {
restrict: "E",
replace: true,
scope: {
person: "="
},
template:
'<p>Hello {{person.firstName}} {{person.lastName}}</p>'
};
});
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但它也会导致JavaScript错误:
Error: 10 $digest() iterations reached. Aborting!
Run Code Online (Sandbox Code Playgroud)
绑定常量对象而不导致错误的正确方法是什么?
假设我们有两个类,Foo和Foo Sub,每个类分别位于不同的文件foo.rb和foo_sub.rb中.
foo.rb:
require "foo_sub"
class Foo
def foo
FooSub.SOME_CONSTANT
end
end
Run Code Online (Sandbox Code Playgroud)
foo_sub.rb:
require "foo"
class FooSub < Foo
SOME_CONSTANT = 1
end
Run Code Online (Sandbox Code Playgroud)
由于循环依赖,这不起作用 - 我们无法定义任何一个没有另一个的类.我见过各种各样的解决方案.其中两个我想避免 - 即将它们放在同一个文件中并删除循环依赖.所以,我发现的唯一其他解决方案是前向声明:
foo.rb:
class Foo
end
require "foo_sub"
class Foo
def foo
FooSub.SOME_CONSTANT
end
end
Run Code Online (Sandbox Code Playgroud)
foo_sub.rb
require "foo"
class FooSub < Foo
SOME_CONSTANT = 1
end
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果我有三个文件,我就无法做同样的事情:
foo.rb:
class Foo
end
require "foo_sub_sub"
class Foo
def foo
FooSubSub.SOME_CONSTANT
end
end
Run Code Online (Sandbox Code Playgroud)
foo_sub.rb:
require "foo"
class FooSub < Foo
end
Run Code Online (Sandbox Code Playgroud)
foo_sub_sub.rb:
require "foo_sub"
class FooSubSub < …Run Code Online (Sandbox Code Playgroud) 所以我有一个看起来像这样的课程:
public class MyClassToTest()
{
MyStaticClass.DoSomethingThatIsBadForUnitTesting();
}
Run Code Online (Sandbox Code Playgroud)
和一个看起来像这样的静态类:
public static class MyStaticClass()
{
public static void DoSomethingThatIsBadForUnitTesting()
{
// Hit a database
// call services
// write to a file
// Other things bad for unit testing
}
}
Run Code Online (Sandbox Code Playgroud)
(显然这是一个愚蠢的例子)
所以,我知道第二类在单元测试方面注定要失败,但有没有办法解开MyClassToTest类,以便我可以测试它(没有实例化MyStaticClass).基本上,我希望它忽略这个电话.
注意:遗憾的是这是一个Compact Framework项目,因此不能使用Moles和Typemock Isolator等工具:(.
我目前正在为编译为JavaScript的小语言编写编译器.在这种语言中,我非常喜欢使用整数,但JavaScript只支持Number,这是一个双精度浮点值.那么,在JavaScript中实现整数的最有效方法是什么?与使用Number相比,这有多高效?
特别是,溢出行为应该与其他语言一致:例如,向INT_MAX添加一个应该给出INT_MIN.整数应该是32位或64位.
c# ×2
angularjs ×1
integer ×1
javascript ×1
math ×1
mocking ×1
require ×1
ruby ×1
static ×1
unit-testing ×1