我刚刚开始使用PHP,我想知道是否有一种方法可以将匿名函数添加到类实例中.
例如,让我们说......
class A{
public B;
}
$c = new A();
//This is where I am getting a little confused...
//The following wont work
$c->B = function(){echo('HelloWorld');};
$c->B();
Run Code Online (Sandbox Code Playgroud)
我希望做的是在大量不同的应用程序中重用相同的代码,并使其能够"替换"并替换特定实例中的函数.
我使用php5.3(所以匿名函数应该工作,只是不是我使用它们的方式).
非常感谢您的时间!
-GK
我正在尝试使用带有匿名函数的array_walk,但我总是得到错误
// Parse error: syntax error, unexpected T_FUNCTION in ... on line X
if(!empty($myArray)) {
array_walk($myArray, function(&$value, $key){ // Line X
$value = '"'.$value.'"'; // Add quotes
});
}
Run Code Online (Sandbox Code Playgroud)
周围的文件语法是正确的.有什么想法吗?
什么时候Scala编译器真的需要匿名函数参数的类型信息?
例如,给定此功能:
def callOn[T,R](target: T, f: (T => R)) = f(target)
Run Code Online (Sandbox Code Playgroud)
然后我不能这样使用它:
callOn(4, _.toString)
=> error: missing parameter type for expanded function ((x$1) => x$1.toString)
Run Code Online (Sandbox Code Playgroud)
我必须指明
callOn(4, (_: Int).toString)
Run Code Online (Sandbox Code Playgroud)
这是相当丑陋的.为什么我的示例不起作用,而集合类上的map,filter,foldLeft等方法似乎不需要这种显式类型?
我希望有一个用PHP编写的函数,它可以创建〜5个参数的匿名函数并返回它们,这样我就可以将它们存储在一个键/值数组中,稍后调用它们,而不需要了解给定的参数,不止一次.
例如
$fun();
Run Code Online (Sandbox Code Playgroud)
之后如何实现返回和可重复使用的呼叫?
提前致谢.
在Python中,您可以拥有以下内容:
def foo(param1, param2):
def bar():
print param1 + param2
bar()
Run Code Online (Sandbox Code Playgroud)
我在PHP中遇到这种行为有些困难.我希望这可以通过以下方式工作:
function foo($param1, $param2)
{
function bar()
{
echo $param1 + $param2;
}
bar();
}
Run Code Online (Sandbox Code Playgroud)
但那失败了.所以我读了一些关于闭包的内容(这被称为闭包不是吗?它是在Python中,我知道).在关于匿名函数的php文档中(他们说它们已被实现为闭包),它们告诉您以下列方式使用use()表达式:
function foo($param1, $param2)
{
function bar() use($param1, $param2)
{
echo $param1 + $param2;
}
bar();
}
Run Code Online (Sandbox Code Playgroud)
但那仍然失败.所以我把它改成了PHP-anonymous函数,就像这样:
function foo($param1, $param2)
{
$bar = function() use($param1, $param2)
{
echo $param1 + $param2;
};
$bar();
}
Run Code Online (Sandbox Code Playgroud)
这确实有效,但它看起来真的很难看.我错过了什么吗?我可以用任何方式改进吗?或者我只需要使用'丑陋'的方式?
(我不是在寻找关于闭包是否有用的讨论)
让我们想象一下范围内的以下项目:
object Thing {
var data: Box[String] = Empty
}
def perform[T](setter: Box[T] => Unit) {
// doesn't matter
}
Run Code Online (Sandbox Code Playgroud)
以下无法编译:
perform(Thing.data = _)
Run Code Online (Sandbox Code Playgroud)
错误消息是:
<console>:12: error: missing parameter type for expanded function ((x$1) => Thing.data = x$1)
perform(Thing.data = _)
^
<console>:12: warning: a type was inferred to be `Any`; this may indicate a programming error.
perform(Thing.data = _)
^
Run Code Online (Sandbox Code Playgroud)
以下编译:
perform(Thing.data_=)
Run Code Online (Sandbox Code Playgroud)
我已经通过创造更好的抽象来超越这个问题,但我的好奇心仍然存在.
谁能解释为什么会这样?
functional-programming scala type-inference anonymous-function
我只是想知道,确切的语法是如何ref以及out委托和内联lambda函数的参数.
这是一个例子
如果函数定义为
public void DoSomething(int withValue) { }
Run Code Online (Sandbox Code Playgroud)
可以通过创建函数中的委托
public void f()
{
Action<int> f2 = DoSomething;
f2(3);
}
Run Code Online (Sandbox Code Playgroud)
如果将原始函数定义为,那该语法是怎样的
public void DoSomething(ref int withValue) { withValue = 3; }
Run Code Online (Sandbox Code Playgroud) 假设我创建了一个像这样的对象工厂:
var newObj=function(x){
var obj=[]
obj.x=x
obj.add=function(n){
return this.x+n
}
return obj
}
Run Code Online (Sandbox Code Playgroud)
现在假设我创建了这个对象的数百个实例:
var obj1=newObj(1)
var obj2=newObj(2)
...
Run Code Online (Sandbox Code Playgroud)
每个obj1,obj2,...是否存储了自己的obj.add副本,还是它们都包含对存储在内存中的单个obj.add实例的引用?
谢谢!
我有一个帮助方法,用于我的单元测试,断言特定顺序的事件是按特定顺序引发的.代码如下:
public static void ExpectEventSequence(Queue<Action<EventHandler>> subscribeActions, Action triggerAction)
{
var expectedSequence = new Queue<int>();
for (int i = 0; i < subscribeActions.Count; i++)
{
expectedSequence.Enqueue(i);
}
ExpectEventSequence(subscribeActions, triggerAction, expectedSequence);
}
public static void ExpectEventSequence(Queue<Action<EventHandler>> subscribeActions, Action triggerAction, Queue<int> expectedSequence)
{
var fired = new Queue<int>();
var actionsCount = subscribeActions.Count;
for(var i =0; i< actionsCount;i++)
{
subscription((o, e) =>
{
fired.Enqueue(i);
});
}
triggerAction();
var executionIndex = 0;
var inOrder = true;
foreach (var firedIndex in fired)
{
if (firedIndex != …Run Code Online (Sandbox Code Playgroud) 我对这里讨论的问题有一个后续问题: Laravel核心方法混淆
我与driechel(上面提到的问题的作者)的情况相同,目前已经习惯了Laravel 4 FW并检查了核心.虽然给出了一个精确的答案,但我仍然不了解逻辑和幕后发生的事情.所以我非常感谢进一步的解释.我知道这可能是重复的,但由于我无法发表评论,我会用一个新问题给它一个镜头.希望这样好.
从本文开始,我一直在从另一个角度看这个:http: //blog.joynag.net/2013/05/facades-in-laravel-4-and-static-methods-resolution/
在检查调用时,File:get()我最终在Container类的share函数中结束,该函数使用此实际参数调用share(function() { return new Filesystem; }.
我无法弄清楚的是使用$container.特别是在关闭时的第二次出现:
$object = $closure($container);
你能再次澄清一下吗?为什么$container在此处作为参数传递以及实际包含在其中的内容?据我所知$closure,保持并执行function() { return new Filesystem; }没有输入参数.
我搞不清楚了.现在研究这个和PHP匿名函数/闭包连续两天仍然无法弄明白.我既不理解$closure($container)这里的语法也不理解逻辑.
php ×5
c# ×2
closures ×2
lambda ×2
scala ×2
callback ×1
class ×1
delegates ×1
events ×1
function ×1
inline ×1
instance ×1
javascript ×1
laravel-4 ×1
performance ×1
return-value ×1
unit-testing ×1