我最近一直在玩代理Func<T, TResult>并创建返回Func<T, TResult>包含lambda的不同实例的方法,但我一直在努力想出的是为什么人们想要返回(甚至创建这样的实例)的任何好的现实世界观点.
在MSDN上有一个例子,它们执行以下操作......
Func<string, string> convertMethod = UppercaseString;
private static string UppercaseString(string inputString)
{
return inputString.ToUpper();
}
Run Code Online (Sandbox Code Playgroud)
虽然它看起来很漂亮并且是一个有趣的概念,但我没有看到这些代码提供的优势.
那么有人可以提供他们必须使用的任何现实世界的例子,Func<T, TResult>并且一般为什么人们可能想要使用这个代表?
拿一个人为的例子,我想protected static从另一个上下文通过回调函数调用一个方法:
class Foo {
protected static function toBeCalled() { }
public static function bar() {
functionThatAcceptsACallback(function () {
self::toBeCalled();
});
}
}
Run Code Online (Sandbox Code Playgroud)
这在PHP 5.3中是否可行?我找不到让它工作的方法......
可能重复:
直接调用分配给对象属性的闭包
为什么这在PHP中是不可能的?我希望能够为特定对象动态创建一个函数.
$a = 'a';
$tokenMapper->tokenJoinHistories = function($a) {
echo $a;
};
$tokenMapper->tokenJoinHistories($a);
Run Code Online (Sandbox Code Playgroud) 我有这样的代码:
function demo() {
this.val=5;
function() {
this.val=7;
}();
}
Run Code Online (Sandbox Code Playgroud)
现在,当我在firefox或chrome控制台中执行此代码时,它会出现语法错误.我不明白为什么这是一个错误,因为我已经读过javascript函数是对象所以当我调用匿名函数时,里面this指向函数demo并且应该更改为valto 7,所以如果我这样做
var x=new demo();
x.val; //should give 7
Run Code Online (Sandbox Code Playgroud)
但是当我这样做的时候
function demo() {
this.val=5;
var f=function() {
this.val=7;
}();
}
window.val; // gives 7
Run Code Online (Sandbox Code Playgroud)
我不明白函数是否是对象然后this匿名函数指向window和不指向的原因demo.请解释一下.
如何使这个javascript警报0,1和2而不是3 3?
var vals = [1, 2, 3];
for(var i = 0; i < vals.length; i++)
{
window.setTimeout(function() {alert(i);}, 1000);
}
Run Code Online (Sandbox Code Playgroud)
我知道它为什么这样做,但我无法弄清楚,如何传递i给匿名函数.
在下面的代码示例中,我不明白为什么函数fun可以作为参数传递给方法addAction.该方法fun属于类型Unit,而该方法addAction需要类型的函数() => Unit.
如果fun是类型() => Unit,那么当我尝试添加到操作列表时,为什么编译器会抱怨fun类型?Unitfunactions = fun :: actions
package myscala
object MyScala {
def fun() { println("fun1 executed.") }
def addAction(a: () => Unit) {
actions = a :: actions
}
var actions: List[() => Unit] = List()
def main(args: Array[String]) {
// the following line would produce a compiler error (found: Unit, required: () => Unit), it's OK …Run Code Online (Sandbox Code Playgroud) 我在matlab 2011a中遇到了严重的匿名函数性能问题,其中匿名容器函数引入的开销远远大于封闭函数本身所花费的时间.
我已经阅读了几个相关问题,其中用户帮助解释了这是其他人遇到的问题,这表明我可以通过取消匿名容器来大幅提高性能.不幸的是,我的代码结构是这样的,我不知道如何在不破坏很多东西的情况下做到这一点.
那么,是否存在改进匿名函数性能而不完全消除它们的变通方法,或者设计模式以允许我不使用代码并花费大量时间进行重构而取消它们?
一些可能有用的细节:
下面是匿名函数的集合,它们存储为类属性.使用由switch语句反过来使用的int数组原则上可以替换数组,但是GP的内容可能会发生变化 - 还有其他函数具有与可以在那里使用的traing相同的参数结构 - 和在某些情况下,GP的内容可以在运行时确定.
m3.GPs = {@(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,1,params,[1 0]');
@(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,1,params,[-1 1]');
@(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,2,params,0);
@(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,3,params,0);
@(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,4,params,[0 0 0]')};
Run Code Online (Sandbox Code Playgroud)
之后,GP的元素由类的成员函数调用,如下所示:
GPt = GPs{t(j)}(xj,yj,gridX(xi),thetaT(1),thetaT(2:end));
Run Code Online (Sandbox Code Playgroud)
根据分析器,匿名包装器的自我时间占总时间的95%(44次调用为1.7秒!),而所包含的函数为5%.我在其他地方使用类似的方法,按比例说,匿名包装器的成本更高.
有没有人对如何减少匿名调用的开销有任何想法,或者,如果没有,如何替换匿名函数同时保留他们提供的灵活性(并且不引入一堆额外的簿记和参数传递)?
谢谢!
当我学习JavaScript时,我一直在浏览网页,并在Javascript中看到了许多对构造的引用,但我似乎无法找到它们是什么以及它们不是什么的完整定义,尤其是在Javascript的上下文中.
例如,在"类似问题"中,我看到的链接导致了一个包含以下代码的示例:
(function () {
})();
Run Code Online (Sandbox Code Playgroud)
据我所知,这是一个构造,但它们定义的是什么?
我使用匿名函数实现了一个分段函数,该函数也可以在向量或矩阵中进行求值:
f = @(x) exp(((x-.25).*(x-.75)).^-1) .* (.25 < x & x < .75);
Run Code Online (Sandbox Code Playgroud)
问题是在准确评估时,0.25或者0.75我们试图评估Inf * 0哪些结果NaN.我想将这些NaN值设置为零.我知道这可以使用文件中定义的函数轻松完成,但我想知道是否有一个解决方案可以让你进行内联.(可能定义其他匿名帮助函数.)
我用的是这种类型
type
TRealFunction = reference to function(const X: extended): extended;
Run Code Online (Sandbox Code Playgroud)
在我的代码中很多.假设我有一个变量
var
rfcn: TRealFunction;
Run Code Online (Sandbox Code Playgroud)
并尝试分配Math.ArcSec给它:
rfcn := ArcSec;
Run Code Online (Sandbox Code Playgroud)
这与Delphi 2009中的预期一样,但现在我尝试在Delphi 10.2中编译它,并且编译器感到不安:
[dcc32 Error] Unit1.pas(42): E2010 Incompatible types: 'TRealFunction' and 'ArcSec'
Run Code Online (Sandbox Code Playgroud)
所不同的,似乎是ArcSec超载德尔福10.2:它有single,double和extended口味.看起来编译器不喜欢引用这种类型的重载函数(或过程)(太类似的类型?).
但是,如果我重新定义
type
TRealFunction = function(const X: extended): extended;
Run Code Online (Sandbox Code Playgroud)
它编译得很好.
当然,这里有明显的解决方法:我可以定义
function ArcSec(const X: extended): extended; inline;
begin
result := Math.ArcSec(X);
end;
Run Code Online (Sandbox Code Playgroud)
或者我可以写
rfcn := function(const X: extended): extended
begin
result := Math.ArcSec(x);
end;
Run Code Online (Sandbox Code Playgroud)
尽管如此,这仍然需要编写很多代码.有更简单的解决方法吗?
javascript ×3
matlab ×2
php ×2
c# ×1
delphi ×1
execution ×1
func ×1
lambda ×1
methods ×1
overloading ×1
performance ×1
scala ×1
this ×1
typechecking ×1