我正在阅读Avalonia的源代码,我遇到了这样一句话:
return new MenuFlyoutPresenter
{
[!ItemsControl.ItemsProperty] = this[!ItemsProperty],
[!ItemsControl.ItemTemplateProperty] = this[!ItemTemplateProperty]
};
我从没见过这样的语法。如果没有索引属性或这个[]访问器,这些括号会做什么?,如果他们所指的财产不是布尔,为什么要用感叹号来否定呢?,也许是某种空检查?
代码本身包含在以下cs文件中:
https://github.com/AvaloniaUI/Avalonia/blob/master/src/Avalonia.Controls/Flyouts/MenuFlyout.cs
我跟踪了代码,但无法理解该语法的作用。
一个相对简单的类演示了一种允许这种语法的方法:
public sealed class Demo
{
public Demo this[Demo index] // Indexer
{
get => !index;
set {} // Not needed to demonstrate syntax.
}
public static Demo operator !(Demo item) => item;
public Demo ItemsProperty => _empty;
public Demo ItemTemplateProperty => _empty;
public Demo SomeMethod(Demo ItemsControl)
{
return new Demo
{
[!ItemsControl.ItemsProperty] = this[!ItemsProperty],
[!ItemsControl.ItemTemplateProperty] = this[!ItemTemplateProperty],
};
}
static Demo _empty = new();
}
需要注意的是:
Demo
implementsoperator
允许
运算符用于该类型的值(例如SomeMethod()
初始化中的!ItemsProperty
)
它是
操作符()的组合
运算符以及启用语法的这个[Demo]
索引器。
这里发生了一些事情。
一、语法:
var menu = new MenuFlyoutPresenter
{
[key] = value,
};
是集合初始值设定项,是以下内容的缩写:
var menu = new MenuFlyoutPresenter();
menu[key] = value;
该索引器定义如下:
public IBinding this[IndexerDescriptor binding]
{
get { return new IndexerBinding(this, binding.Property!, binding.Mode); }
set { this.Bind(binding.Property!, value); }
}
因此,键
有一个索引描述符
,值
是一个索引
。
这是怎么回事?
!ItemsControl.ItemsProperty
我们可以从您的链接中看到,ItemsProperty
是一个DirectProperty
public static IndexerDescriptor operator !(AvaloniaProperty property)
{
return new IndexerDescriptor
{
Priority = BindingPriority.LocalValue,
Property = property,
};
}
Avalonia似乎喜欢重载运算符,如
!
和~
来做你可能没有想到的事情(通常会使用for的方法)。在这种情况下,他们使用!AvaloniaProperty上的
作为访问该属性绑定的简写。
问题内容: Java表达式中的双引号是什么意思? 我有: 有人可以解释这些表达式的计算方式,最后一个的目的是什么? 问题答案: 里面的任何东西都会变成。和+ =。例如 你会得到 在你的问题上 将被评估为:
问题内容: 我正在用Java编写程序以接受查询。如果我有类似的查询 …我可以使用什么正则表达式将其转换为: …要么: 实际上,我想知道如何编写正则表达式以仅删除方括号内的空格。 问题答案: 假设括号正确平衡且没有嵌套括号,则以下内容将删除括号内(且仅在括号内)的所有空格: 它转变 进入 说明:
问题内容: 我在jQuery文件中找到了这个: 花括号做什么? 问题答案: 在您的情况下,这是一个传递给CSS函数的对象。 在这里你也可以使用 这是物体的另一个例子
问题内容: 我对以下python表达式很感兴趣: 任务是将2个字典合并为第三个字典,以上表达式可以很好地完成任务。我对运算符及其对表达式的作用很感兴趣。我以为是幂运算符,并且尚未在上面的上下文中看到它。 完整的代码段是这样的: 问题答案: 参数列表中的in有特殊含义,如本教程的4.7节所述。随其传递的字典(或类似字典的)对象被扩展为可调用对象的关键字参数,就像被扩展为单独的位置参数一样。
和?我试着在谷歌上搜索,但没有成功。
PEP 572引入了为Python 3.8实现的赋值表达式(俗称Walrus操作符)。这似乎是一个非常重要的新特性,因为它将允许在理解和lambda函数中进行这种形式的赋值。 赋值表达式的语法、语义学和语法规范到底是什么? 为什么在PEP 379中关于“添加赋值表达式”的类似想法之前遭到拒绝的情况下,引入了这个新的(似乎相当激进的概念)?