首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Kotlin】扩展函数 ① ( 扩展函数简介 | 为 Any 超类定义扩展函数 | private 私有扩展函数 | 泛型扩展函数 | 标准函数 let 函数是泛型扩展函数 )

文章目录 一、扩展函数简介 二、为 Any 超类定义扩展函数 三、private 私有扩展函数 四、泛型扩展函数 五、标准函数 let 函数是泛型扩展函数 一、扩展函数简介 ---- 为 现有类 定义...扩展函数 , 可以在 不修改 原有类 的情况下 增加类的功能 ; Kotlin 中如果类 没有被 open 关键字修饰 , 则该类 不能被继承 , 如果想要扩展该类 , 可以使用 扩展函数 ; 扩展函数...): 返回值类型 { 函数体 } 定义扩展函数 与 定义普通函数唯一的区别是 扩展函数 前多了 类名. ; 下面的代码中 , 为 String 定义扩展函数 , 拼接原字符串和扩展函数参数 , 并将结果返回...---- 扩展函数 的特点 是 为 父类定义扩展函数 , 子类也可以调用该扩展函数 ; 为 Any 超类 定义 扩展函数 , 那么 所有的 Any 子类 都可以 调用该 扩展函数 ; 一旦在 Any...超类中定义了扩展函数 , 则在整个项目中 , 该扩展函数都有效 ; 这就导致了 Kotlin 的框架非常灵活 , 使用别人的 SDK 时会发现 为各种现有类定义的 扩展函数 ; 代码示例 : 在下面的代码中

1.7K20

【Kotlin】扩展函数 ③ ( 定义扩展文件 | 重命名扩展函数 | Kotlin 标准库扩展函数 )

文章目录 一、定义扩展文件 二、重命名扩展函数 三、Kotlin 标准库扩展函数 一、定义扩展文件 ---- 如果定义的 扩展函数 需要在 多个 Kotlin 代码文件 中使用 , 则需要在 单独的...Kotlin 文件 中定义 , 该文件被称为 扩展文件 ; 定义 标准库函数 的 Standard.kt 就是 独立的 扩展文件 ; 代码示例 : 扩展文件一般都 单独定义在一个 Package 中...-- 如果 对 要调用的 扩展函数 名字不满意 , 则可以 使用 as 关键字 重命名扩展函数 ; 注意 : 一旦使用了 重命名扩展函数 , 则原扩展函数不能使用 , 一旦使用 , 直接报 Unresolved...---- Kotlin 标准库 提供的功能 , 都是通过 扩展函数 实现的 , 为 现有类 扩展的 标准库文件 都是 在 类名的基础上加上 s 来命名的 , 如 : 为 Sequence 类提供的扩展函数...| takeIf 函数 | takeUnless 函数 ) , 基本都是 泛型扩展函数 ;

1.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Kotlin】扩展函数总结 ★ ( 超类扩展函数 | 私有扩展函数 | 泛型扩展函数 | 扩展属性 | 定义扩展文件 | infix 关键字用法 | 重命名扩展函数 | 标准库扩展函数 )

    文章目录 一、扩展函数简介 二、为 Any 超类定义扩展函数 三、private 私有扩展函数 四、泛型扩展函数 五、标准函数 let 函数是泛型扩展函数 六、扩展属性 七、可空类扩展 八、使用 infix...关键字修饰单个参数扩展函数的简略写法 九、定义扩展文件 十、重命名扩展函数 十一、Kotlin 标准库扩展函数 一、扩展函数简介 ---- 为 现有类 定义 扩展函数 , 可以在 不修改 原有类 的情况下...扩展函数 前多了 类名. ; 下面的代码中 , 为 String 定义扩展函数 , 拼接原字符串和扩展函数参数 , 并将结果返回 ; 代码示例 : /** * 为 String 定义扩展函数, 拼接原字符串和扩展函数参数...---- 扩展函数 的特点 是 为 父类定义扩展函数 , 子类也可以调用该扩展函数 ; 为 Any 超类 定义 扩展函数 , 那么 所有的 Any 子类 都可以 调用该 扩展函数 ; 一旦在 Any...| private 私有扩展函数 | 泛型扩展函数 | 标准函数 let 函数是泛型扩展函数 ) 中 , 介绍了给 现有类 定义 扩展函数 , 此外还可以 给现有类定义 扩展属性 ; 为现有类定义 扩展属性

    2.5K30

    【Kotlin】扩展函数作用域分析 ( 扩展函数导入 | 扩展函数重载 | 扩展函数作用域优先级 )

    扩展函数 作用域 总结 II . 扩展函数 作用域 III . 扩展函数 作用域 简单调用示例 IV . 扩展函数 重载分析 V . 扩展函数 重载代码示例 VI ....扩展函数 作用域 总结 ---- 扩展函数作用域总结 : ① 扩展函数作用域 : 扩展函数使用需要导入包 , 如果在本包中使用 , 可以默认不导入包 ; ② 扩展函数可以重载 : 函数名相同 , 函数签名不同的扩展函数可以同时定义...扩展函数 作用域 ---- 1 . 扩展函数作用域 : 定义一个扩展函数 , 默认只能在本包中调用 , 如果在别的包调用扩展函数 , 需要导入扩展函数 ; 2 ....扩展函数导入 : 调用接收者类型的扩展函数 , 需要导入扩展函数的包 , 导入格式为 : import 包名.扩展函数名 3 ....调用定义在本包里的扩展函数 : 可以直接调用 , 导入扩展函数的操作可以省略 , 写上也不会出错 ; 4 . 调用定义在其它包的扩展函数 : 必须导入扩展函数 , 才能调用该扩展函数 ; III .

    82420

    函数扩展

    # 函数扩展 # 函数参数的默认值 # 基本用法 ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法。...function doSomething(a, b) { 'use strict'; // code } ES2016 做了一点修改,规定只要函数参数使用了默认值、解构赋值、或者扩展运算符,那么函数内部就不能显式设定为严格模式...,同时适用于函数体和函数参数。...虽然可以先解析函数体代码,再执行参数代码,但是这样无疑就增加了复杂性。因此,标准索性禁止了这种用法,只要参数使用了默认值、解构赋值、或者扩展运算符,就不能显式指定严格模式。 两种方法可以规避这种限制。...# 嵌套的箭头函数 箭头函数内部,还可以再使用箭头函数。下面是一个 ES5 语法的多重嵌套函数

    80310

    函数扩展

    函数扩展.png 函数扩展 函数参数的默认值 ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面 参数变量是默认声明的,所以不能用let或const再次声明。...这样就不需要使用arguments对象了 rest 参数就不存在这个问题,它就是一个真正的数组,数组特有的方法都可以使用 严格模式 ES2016 做了一点修改,规定只要函数参数使用了默认值、解构赋值、或者扩展运算符...,那么函数内部就不能显式设定为严格模式,否则会报错 设定全局性的严格模式,这是合法的 函数包在一个无参数的立即执行函数里面 name 属性 函数的name属性,返回该函数函数名。...Function构造函数返回的函数实例,name属性的值为anonymous bind返回的函数,name属性值会加上bound前缀 箭头函数 ES6 允许使用“箭头”(=>)定义函数 如果箭头函数不需要参数或需要多个参数...(4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数 箭头函数内部,还可以再使用箭头函数 双冒号运算符 现在有一个提案,提出了“函数绑定”(function bind)运算符,

    48820

    Kotlin 扩展函数 与 JS 的 prototypeKotlin 扩展函数 与 JS 的 prototype

    Kotlin 扩展函数 与 JS 的 prototype Kotlin 扩展函数 Kotlin的扩展函数功能使得我们可以为现有的类添加新的函数,实现某一具体功能 。...扩展函数是静态解析的,并未对原类添加函数或属性,对类本身没有任何影响。 扩展属性允许定义在类或者kotlin文件中,不允许定义在函数中。...: list.swap(list.binarySearch(otherList.max()), list.max()) 2.类-扩展函数 1.定义 为MutableList类扩展一个swap函数:...扩展函数是静态解析分发的,不是虚函数(即没有多态),调用只取决于对象的声明类型! 1.调用是由对象声明类型决定,而不是由对象实际类型决定!...3.伴生对象-扩展函数和属性 可为伴生对象定义扩展函数和属性: class MyClass { companion object { } //伴生对象 } fun

    1.6K20

    Python调用C函数的方法以及如何编写Python的C扩展

    标题比较长,其实“如何用Python调用C的函数”以及“如何编写Python的C扩展”在广义上是同一件事,因为都是用C写底层实现,用Python作接口。...前段时间笔者用SWIG编译某小段函数一直出BUG,检查了两天才发现原来是因为MinGW 32-bit和Python 64-bit不兼容,加之后续笔者还需要用到NumPy C-API,所以现在笔者已弃坑SWIG...,转用以下方法: 按照Python C-API的编程规范,用C编写底层实现函数。...02 正文 编写C代码 假设要实现一个数学计算模块mymath,包含一个整数加法的函数add,那么首先要编写以下代码: #include "D:\Anaconda2\include\Python.h".../* file: mymath.c * /// 真正实现 int add(int a, int b) { return a + b; } // 包装函数

    1.9K60

    【Kotlin】扩展函数 ② ( 扩展属性 | 为可空类型定义扩展函数 | 使用 infix 关键字修饰单个参数扩展函数的简略写法 )

    文章目录 一、扩展属性 二、可空类扩展 三、使用 infix 关键字修饰单个参数扩展函数的简略写法 一、扩展属性 ---- 上一篇博客 【Kotlin】扩展函数 ( 扩展函数简介 | 为 Any 超类定义扩展函数...| private 私有扩展函数 | 泛型扩展函数 | 标准函数 let 函数是泛型扩展函数 ) 中 , 介绍了给 现有类 定义 扩展函数 , 此外还可以 给现有类定义 扩展属性 ; 为现有类定义 扩展属性...---- 之前讲的定义扩展函数 , 扩展属性 , 都是为 非空类型 定义的 , 如果要为 可空类型 定义扩展函数 , 则需要在 扩展函数 中 处理时 , 要多考虑一层 接收者 this 为空 的 情况...非空类型扩展函数 如果定义的 扩展函数 是为 可空类型定义的 , 可空类型变量 想要调用该 扩展函数 , 在调用时直接使用 " . " 进行调用即可 ; 可空类型实例对象.可空类型扩展函数 代码示例...---- 如果 扩展函数 只有 一个参数 , 并且在 扩展函数 定义时 使用了 infix 关键字修饰 , 在调用该扩展函数时 , 可以省略 接收者与函数之间的点 和 参数列表的括号 ; 调用 使用

    1.9K30

    ES6: 函数扩展

    带默认值参数的函数:var get_name = function(url, id=1, callback){}; 如果传入了第二个参数,将不会使用默认值 如果给第二个参数赋值为undefined...args = ['url', 123, 'st']; get_names(...args); new.target: 使用new创建一个对象时,会被赋值为新对象的构造器 ES6允许在代码块中定义函数...,在严格模式中,块级函数只能在块级作用域中使用,而非严格模式中,块级函数会被提升到全局 箭头函数 没有this,super,arguments,new.target,这些值由所在的、最靠近的非箭头函数来决定...function() {return name}};}) 尾调用优化:满足以下条件的尾调用将会被优化,在尾调用时不会创建新的栈帧,而是清除当前栈帧并再次利用它 尾调用不能引用当前栈帧中的变量(意味着该函数不能是闭包...) 进行尾调用的函数在尾调用返回结果后不能做额外操作 尾调用的结果作为当前函数的返回值

    9110

    Kotlin---标准扩展函数

    介绍 除了自定义扩展之外,Kotlin中也定义了很多的扩展函数,而这些扩展函数的接收类型是范型,也就是所有对象都可以使用。这些标准的扩展函数都放在了Standard.kt中。...代表它是一个扩展函数,而接收参数是一个泛型 block:(T)->R代表函数的参数是一个代码块,而这个代码块接收参数T,并且返回R类型的对象 :R代表整个let函数返回类型是R类型 其中很重要的一个概念是...block(this):执行代码块中的代码,并且将调用扩展函数的对象作为参数传入,返回结果 let函数举例 例如下面的函数,如果student不为空的话,则会打印名字和年龄。...扩展函数来使用 fun acceptStudent(student: Person?)...predicate(this)) this else null } with函数 with函数不是一个扩展函数,它的原型如下: 这个函数主要会接收一个对象,然后调用该对象的扩展代码块,然后返回代码块中的值

    52820

    python扩展

    一个简单的用来检测回文的C语言函数(palindrome.c) #include int is_palindrome(char *text) { int i,n=strlen(text...= text[n-i-1]) return 0; } return 1; } python版本的检测回文的函数 def is_palindrome(text): n = len(text)...最终要的是排除一些东西,比如,如果要包装一个巨大的C语言库,可能需要导出一些函数Python中,在这种情况下,只要把需要导出的函数放到接口文件中就可以了。...在接口文件中,就像在一个头文件中做得那样,只需声明要导出的所有的函数即可,除此之外,头部的一个单元内,可以指定包含的头文件以及在这之前的一个%module声明,即为模块定义的一个名字。...可能需要的所有文件在  比如/usr/include/python2.6 $gcc -c palindrome.c $gcc -I/usr/include/python2.6 -c palindrome_wrap.c

    40310

    Python扩展内容

    Python扩展内容 阅读本文需要3分钟 ① python中yield关键字的使用: yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器 当你调用这个函数的时候,函数内部的代码并不立马执行...,这个函数只是返回一个生成器对象 当你使用for进行迭代的时候,函数中的代码才会执行 生成器特点:可迭代;只能读取一次;实时生成数据,不全存在内存中。...#输出结果: -------------------- zhangsan : 22 -------------------- wangwu : 24 ''' #案例二:代码拆分(将数据的处理封装成函数...']) ''' #输出结果: -------------------- zhangsan : 22 -------------------- wangwu : 24 ''' ② 装饰器的使用: python...装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数, 使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。

    58120
    领券