为简单起见,请想象以下代码:
我想创建一个Foo:
public class Foo
{
public string Bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并将其传递给特殊的Html Helper方法:
Html.SomeFunction(f => f.Bar);
Run Code Online (Sandbox Code Playgroud)
其定义为:
public string SomeFunction<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
Run Code Online (Sandbox Code Playgroud)
我想在这个函数中得到Bar的值,但是完全不知道如何得到它.
我有一个案例,我想调用一个方法n次,其中n是一个Int.在Scala中以"功能"方式有一个很好的方法吗?
case class Event(name: String, quantity: Int, value: Option[BigDecimal])
// a list of events
val lst = List(
Event("supply", 3, Some(new java.math.BigDecimal("39.00"))),
Event("sale", 1, None),
Event("supply", 1, Some(new java.math.BigDecimal("41.00")))
)
// a mutable queue
val queue = new scala.collection.mutable.Queue[BigDecimal]
lst.map { event =>
event.name match {
case "supply" => // call queue.enqueue(event.value) event.quantity times
case "sale" => // call queue.dequeue() event.quantity times
}
}
Run Code Online (Sandbox Code Playgroud)
我认为关闭是一个很好的解决方案,但我不能让它工作.我也尝试过for-loop,但它不是一个漂亮的功能解决方案.
我正在尝试做类似以下的事情:
// assume $f is an arg to the wrapping function
$self = $this;
$func = function() use($f, $ctx, $self){
$self->remove($func, $ctx); // I want $func to be a reference to this anon function
$args = func_get_args();
call_user_func_array($f, $args);
};
Run Code Online (Sandbox Code Playgroud)
是否可以使用相同的函数引用分配给$ func的函数?
我有一个字符串string strn = "abcdefghjiklmnopqrstuvwxyz",想要一个字典,如:
Dictionary<char,int>(){
{'a',0},
{'b',1},
{'c',2},
...
}
Run Code Online (Sandbox Code Playgroud)
我一直在尝试这样的事情
strn.ToDictionary((x,i) => x,(x,i)=>i);
Run Code Online (Sandbox Code Playgroud)
...但是我一直在得到关于代表的各种错误,没有采用两个参数,以及未指明的参数等.
我究竟做错了什么?
我更喜欢对答案的提示,所以我对下次需要做的事情有精神上的痕迹,但根据Stackoverflow的性质,答案也很好.
我已在我的网站上安装了Google跟踪代码管理器,并使用它将一些Javascript加载到我的网站上.但是,GTM不再加载,我的Javascript没有加载,错误代码不是很有帮助.
这是我网站上的GTM代码:
<!-- Google Tag Manager -->
<noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-MFQ99J"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-MFQ99J');</script>
<!-- End Google Tag Manager -->
Run Code Online (Sandbox Code Playgroud)
这是我在GTM标签中包含的代码:
<!-- Qualaroo for your website -->
<!-- Paste this code right after the <body> tag on every page of your site. -->
<script type="text/javascript">
var _kiq = _kiq || [];
(function(){
setTimeout(function(){
var d = document, f = d.getElementsByTagName('script')[0], s = d.createElement('script'); s.type = 'text/javascript';
s.async = true; s.src = '//s3.amazonaws.com/ki.js/50553/aS-.js';f.parentNode.insertBefore(s, f);
}, 1); …Run Code Online (Sandbox Code Playgroud) javascript anonymous-function google-chrome-devtools google-tag-manager
为什么匿名函数作为方法的参数而不是构造函数参数?
如果我创建了一个List<string>,它有一个带有以下签名的Sort方法:
public void Sort(IComparer<T> comparer)
Run Code Online (Sandbox Code Playgroud)
以下工作地点:
List<string> list = new List<string>();
list.Sort( (a,b) => a.CompareTo(b) );
Run Code Online (Sandbox Code Playgroud)
SortedSet有一个具有类似签名的构造函数:
public SortedSet(IComparer<T> comparer)
Run Code Online (Sandbox Code Playgroud)
但是在构造函数中使用匿名函数时会失败.以下内容无效:
SortedSet<string> set = new SortedSet<string>( (a, b) => a.CompareTo(b) );
Run Code Online (Sandbox Code Playgroud)
创建排序类可以正常工作:
public class MyComparer : IComparer<string>
{
public int Compare(string a, string b)
{ return a.CompareTo(b); }
}
SortedSet<string> set = new SortedSet<string>( new MyComparer() );
Run Code Online (Sandbox Code Playgroud) 说我有这个匿名功能:
(function(window){
var private = 'private msg';
function sayit() {
alert(private) // works
}
document.body.onclick = sayit; // works
})(window);
// private shouldn't be accessible here
Run Code Online (Sandbox Code Playgroud)
这是JavaScript应该如何表现?
也就是说,无法private从该匿名函数之外的任何地方访问?
如果是这样,是否有可能private从外部找到某种黑客攻击,让代码保持原样?
我已经阅读了很多关于Javascript中的闭包的内容.我在mozilla.org上看到,封闭应该被定义为
(function(){...})();
但在http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html上,它说封闭功能是
(function(){...}());
有什么区别或后者是错的?last()的目的是什么?你会把一些参数放进去吗?我正在寻找一个很好的参考.
编辑:此外,Mozilla.org上有一个例子
var makeCounter = function() {
var privateCounter = 0;
function changeBy(val) {
privateCounter += val;
}
return {
increment: function() {
changeBy(1);
},
decrement: function() {
changeBy(-1);
},
value: function() {
return privateCounter;
}
}
};
Run Code Online (Sandbox Code Playgroud)
为什么这个'功能'需要分号?如果需要在声明后立即调用,则应在结束分号之前放置a().但事实并非如此.
具体来说,我想写这个:
public Func<IList<T>, T> SelectElement = list => list.First();
Run Code Online (Sandbox Code Playgroud)
但我得到一个语法错误T.我不能拥有通用的匿名方法吗?
当我必须编写对可调用函数的引用时,我使用PHP的标准语法定义为:
PHP函数的名称作为字符串传递.可以使用任何内置或用户定义的函数[...省略...].
实例化对象的方法作为包含索引0处的对象和 索引1处的方法名称 (aka字符串)的数组传递.
通过传递类名 (仍然是字符串) 而不是索引0处的对象,也可以传递静态类方法而无需实例化该类的对象.
从PHP 5.2.3开始,也可以传递 (字符串) 'ClassName :: methodName'.
除了常见的用户定义函数,匿名函数也可以传递给回调参数.
对于诸如函数名重构或查找用法之类的操作,所有这些方式都不是"IDE友好的" .
在我的回答中,我提出了一个解决方案,但是还有其他方法可以应用,甚至是完全不同的,允许IDE"找到"方法的调用?
c# ×4
closures ×3
javascript ×3
lambda ×2
php ×2
.net ×1
asp.net-mvc ×1
callable ×1
constructor ×1
delegates ×1
generics ×1
ide ×1
loops ×1
recursion ×1
scala ×1
scope ×1
todictionary ×1