本篇文章给大家谈谈无法为Kotlin声明的函数删除冗余的SAM-constructor,但可以在Java声明的函数上使用,同时本文还将给你拓展c–is_constructible和is_destruc
本篇文章给大家谈谈无法为Kotlin声明的函数删除冗余的SAM-constructor,但可以在Java声明的函数上使用,同时本文还将给你拓展c – is_constructible和is_destructible不受朋友声明的影响、c – 可以在声明的同一行上使用istream初始化一个变量吗?、C++函数声明的时候后面加const、constructor Php 构造函数construct的前下划线是双的_等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:- 无法为Kotlin声明的函数删除冗余的SAM-constructor,但可以在Java声明的函数上使用
- c – is_constructible和is_destructible不受朋友声明的影响
- c – 可以在声明的同一行上使用istream初始化一个变量吗?
- C++函数声明的时候后面加const
- constructor Php 构造函数construct的前下划线是双的_
无法为Kotlin声明的函数删除冗余的SAM-constructor,但可以在Java声明的函数上使用
我有一个Java类函数,如下所示
public void setPositiveButton(int resId, DialogInterface.OnClickListener listener)
我也有如下相同的Kotlin Class函数
fun setPositiveButton(resId: Int, listener: DialogInterface.OnClickListener)
当我从Kotlin代码调用它们时
javaClassObj.setPositiveButton(R.string.some_string, DialogInterface.OnClickListener { _, _ -> someFunc()}) kotlinClassObj.setPositiveButton(R.string.some_string, DialogInterface.OnClickListener { _, _ -> someFunc()})
可以减少Java类函数的调用,但不能减少Kotlin类函数的调用
javaClassObj.setPositiveButton(R.string.some_string, { _, _ -> someFunc()}) kotlinClassObj.setPositiveButton(R.string.some_string, DialogInterface.OnClickListener { _, _ -> someFunc()})
为什么Kotlin函数调用无法按照Java启用的方式减少冗余的SAM-Constructor?
答案1
小编典典为什么在kotlin中使用SAM?同时具有对功能的本地支持。
SAM约定在java8中用作不具有本机功能支持的解决方法。
来自kotlin doc#sam-conversions:
请注意,SAM转换仅适用于接口,不适用于抽象类,即使它们也只有一个抽象方法。
另外,请注意,此功能仅适用于Java互操作。由于Kotlin具有适当的功能类型,因此不需要将功能自动转换为Kotlin接口的实现,因此不受支持。
然后应直接声明一个函数。
fun setPositiveButton(resId: Int, listener: (DialogInterface, Int) -> Unit) { listener.invoke( //DialogInterface, Int )}
然后可以使用
setPositiveButton(1, { _, _ -> doStuff() })
在kotlin 1.4中,可以将SAM转换用于Kotlin类。
fun interface Listener { fun listen()}fun addListener(listener: Listener) = a.listen()fun main() { addListener { println("Hello!") }}
c – is_constructible和is_destructible不受朋友声明的影响
关于`is_constructible,cppreference.com says:
Access checks are performed as if from a context unrelated to T and any of the types in Args. Only the validity of the immediate context of the variable deFinition is considered.
(该网站没有解释is_destructible如何处理访问检查,但访问修饰符确实会影响is_destructible的行为,因此我希望它的工作方式与is_constructible相同.)
因此,在我看来,这段代码不应该编译,因为在检查的直接上下文中,构造函数和析构函数是可用的,如局部变量实例化所证明的:
class Private { Private() {} ~Private() {} friend class Friend; }; class Friend { public: Friend() { // Both of these should fire,but they do not. static_assert( !std::is_constructible<Private>::value,"the constructor is public"); static_assert( !std::is_destructible<Private>::value,"the destructor is public"); // There is no error here. Private p; } };
……但是Coliru compiles it without error(使用GCC或Clang).
这是两个编译器中的错误(或至少是不合格),或者cppreference.com是否歪曲了标准,还是我误解了cppreference.com的声明?
解决方法
Access checks are performed as if from a context unrelated to
T
and
any of the types inArgs
.
说.根据定义,“T的朋友”不“与T无关”.
“immediate context”是一个艺术术语,但无论如何,句子是在谈论假设变量定义的直接上下文,而不是使用is_constructible.
使is_constructible检查依赖于上下文是疯狂的;这意味着相同的类型is_constructible< T,Args ...>在不同的上下文中具有不同的基类.
c – 可以在声明的同一行上使用istream初始化一个变量吗?
int foo; std::cin >> foo;
解决方法
int old; std::cin >> old;
可怕的答案:
int old,dummy = (std::cin >> old,0);
正确的答案:旧的必须用声明定义,然后才能传递给运算符>>作为论据.在变量声明中获取函数调用的唯一方法是将其放在初始化表达式中,如上所述.声明变量并将输入读入的方式如下:
int old; std::cin >> old;
C++函数声明的时候后面加const
非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误),表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用);唯一的例外是对于mutable修饰的成员。加了const的成员函数可以被非const对象和const对象调用,但不加const的成员函数只能被非const对象调用。例如:
1 class A { 2 private: int m_a; 3 public: 4 A() : m_a(0) {} 5 int getA() const { 6 return m_a; //同return this->m_a;。 7 } 8 int GetA() { 9 return m_a; 10 } 11 int setA(int a) const { 12 m_a = a; //这里产生编译错误,如果把前面的成员定义int m_a;改为mutable int m_a;就可以编译通过。 13 } 14 int SetA(int a) { 15 m_a = a; //同this->m_a = a; 16 } 17 }; 18 A a1; 19 const A a2; 20 int t; 21 t = a1.getA(); 22 t = a1.GetA(); 23 t = a2.getA(); 24 t = a2.GetA(); //a2是const对象,
调用非const成员函数产生编译错误。 一般对于不需修改操作的成员函数尽量声明为const成员函数,以防止产生const对象无法调用该成员函数的问题,同时保持逻辑的清晰。
constructor Php 构造函数construct的前下划线是双的_
定义和用法
__construct() 函数创建一个新的 SimpleXMLElement 对象。
如果成功,则该函数返回一个对象。如果失败,则返回 false。
语法
__construct(data,options,is_url,ns,is_prefix)
参数 | 描述 |
---|---|
data | 必需。形式良好的 XML 字符串或 XML 文档的路径或 URL。 |
options | 可选。规定附加的 Libxml 参数。 |
is_url | 可选。规定 data 参数是否是 URL。默认是 false。 |
ns | 可选。 |
is_prefix | 可选。 |
返回值
返回一个表示数据的 SimpleXMLElement 对象。
例子
<?php $xmlstring = <<<XML <?xml version="1.0" encoding="ISO-8859-1"?><note><to>George</to><from>John</from><heading>Reminder</heading>Don''t forget the meeting! </note> XML; $xml = new <code>SimpleXMLElement($xmlstring)</code>; echo $xml->body[0]; ?>
输出类似:
Don''t forget the meeting!<br>后来看construct的前_是一个,我靠,上次也是这个错误,忘了,现在记着了 <br>function __construct() <br>{} <br>不是 <br>function _construct() <br>{}
以上就介绍了constructor Php 构造函数construct的前下划线是双的_,包括了constructor方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
关于无法为Kotlin声明的函数删除冗余的SAM-constructor,但可以在Java声明的函数上使用的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于c – is_constructible和is_destructible不受朋友声明的影响、c – 可以在声明的同一行上使用istream初始化一个变量吗?、C++函数声明的时候后面加const、constructor Php 构造函数construct的前下划线是双的_的相关信息,请在本站寻找。
本文标签: