我有一个像这样的扩展函数:
first_list = [1,2,3,4]
second_list = first_list
second_list[0]=9
print(first_list)
print(second_list)
third_list = list(first_list)
third_list[0]=8
print(third_list)
有了这个,我可以这样做:
$table_name ='search1_ts1';
if(isset($_POST['tablename']) && !empty($_POST['tablename'])){
$table_name =$_POST['tablename'];
}
$search_query='SELECT mobile_no, fname, cus_name '.
'FROM $table_name '.
"WHERE mobile_no LIKE 'mobile_no1%' ".
"AND mobile_no LIKE '%mobile_no2'";
$conditionsql="";
if(isset($_POST['mobile_no1'], $_POST['mobile_no2']) &&
!empty($_POST['mobile_no1'])) {
$conditionsql.=" mobile_no1 like '%" . $_POST['mobile_no1'] . "%'";
}
if(isset($_POST['mobile_no2']) && !empty($_POST['mobile_no2'])){
$conditionsql.=" and mobile_no2 like '%" . $_POST['mobile_no2'] . "%'";
问题是,用户和密码类型仍然是可以为空的形式,所以我仍然需要使用inline fun <A, B, C> Pair<A, B>.notNull(code: (A, B) -> C) {
if (this.first != null && this.second != null) {
code(this.first, this.second)
}
}
来调用用户并传递,即使用户和传递不为空
如何将它转换为各自不可空的类型?
也许是这样的,但是对于泛型:
Pair(username, password).notNull { user, pass ->
// code to execute when username and password is not null
}
答案 0 :(得分:2)
一般答案:
如果你声明一个泛型类或函数,他们可以在替换它们的类型params时包含nullable:
示例:
check_before.html
所以在这种情况下,尽管T没有用T标记,但消息是可以为空的吗? 因此,为了避免传递可为空的参数类型并保证始终替换非null类型,您可以将其更改为:
class Help<T>{
fun printHelp(message :T){
message?.render();
}
}
答案 1 :(得分:2)
在这种情况下,智能转换不起作用,因为您正在访问在另一个模块中声明的类的属性。如果将属性值存储在局部变量中,它将起作用:
inline fun <A : Any, B : Any, C> Pair<A?, B?>.notNull(code: (A, B) -> C) {
val first = this.first
val second = this.second
if (first != null && second != null) {
code(first, second)
}
}
答案 2 :(得分:1)
我认为这会奏效。
inline fun <A: Any, B: Any, C> Pair<A?, B?>.notNull(code: (A, B) -> C) {
if (this.first != null && this.second != null) {
code(this.first!!, this.second!!)
}
}
此处,A
和B
类型未定义为Any?
的子类型。它们仅限于Any
的子类型,因此它们不为空。 (当然,Any
的每个子类型都是Any?
的子类型。)
但是,this
的类型将是Pair<A?, B?>
,因此它将是一对无效的。所有非null类型都是其相应可空类型的子类型,因此任何Pair都可以调用此扩展函数。
<小时/> 编辑:对于存档,yole的答案似乎更受欢迎(不使用
!!
):https://stackoverflow.com/a/48960855/869330