当前位置: 首页 > news >正文

仓颉编程语言的Any 类型(Any 接口)

仓颉编程语言的Any 类型(Any 接口)

Any 类型是一个内置的接口,仓颉中所有接口都默认继承它,所有非接口类型都默认实现它,因此所有类型都可以作为 Any 类型的子类型使用。这意味着不需要程序员自己写interface Any {}。

目前Any类型,必须先通过模式匹配将其转换为具体类型,然后再打印。

注意,仓颉语言目前不能直接使用println(anyObj) 打印输出,因为对Any类型仓颉语言未提相关机制。

例如如下代码是

main() {
    var any: Any = 1
    //pringln(any)  //行不通
    Any = 2.0
    //pringln(any)  //行不通
    Any = "hello, world!"
    //pringln(any)  //行不通
}

应写为(推荐方案)

func printAny(value: Any) {match (value) {case i: Int64 => println(i)case f: Float64 => println(f)case s: String => println(s)case b: Bool => println(b)case _ => println("unknown type")}
}main() {var any: Any = 1printAny(any)  // 输出: 1any = 2.0printAny(any)  // 输出: 2.000000any = "hello, world!"printAny(any)  // 输出: hello, world!
}

运行截图:

或写为:

func anyToString(value: Any): String {match (value) {case  i: Int64 => return i.toString()case  f: Float64 => return f.toString()case  s: String => return scase  b: Bool => return b.toString()case _ => return "unknown"}
}main() {var any: Any = 1println("Value: ${anyToString(any)}")  // 输出: Value: 1any = 2.0println("Value: ${anyToString(any)}")  // 输出: Value: 2.000000 any = "hello, world!"println("Value: ${anyToString(any)}")  // 输出: Value: hello, world!
}

Any 接口综合示例源码

较全面展示了Any接口在类型处理、容器存储和类型检查等方面的应用场景。

// Any 接口综合示例
package demo10import std.math.sqrt  // sqrt
import std.collection.ArrayList // 使用 ArrayList
// 定义不同的类型
class Person {let name: Stringlet age: Intinit(name: String, age: Int) {this.name = namethis.age = age}public func toString(): String {return "Person(name: ${name}, age: ${age})"}
}struct Point {let x: Float64let y: Float64init (x: Float64, y: Float64){this.x = xthis.y = y }public func toString(): String {return "Point(x: ${x}, y: ${y})"}
}enum Status {| Active| Inactive| Pendingpublic func toString(): String {match (this) {case Status.Active => return "Active"case Status.Inactive => return "Inactive"case Status.Pending => return "Pending"}}
}// 通用的打印函数,接受任意类型
func printValue(value: Any) {println("Value type: ")  //${value.getClass().getName()}// 使用模式匹配进行类型判断match (value) {case  i: Int64 => println("  Integer: ${i}")println("  Double value: ${i * 2}")case  f: Float64 => println("  Float: ${f}")println("  Squared: ${f * f}")case  s: String => println("  String: '${s}'")println("  Length: ${s.size}")case  p: Person => println("  ${p.toString()}")println("  Is adult: ${p.age >= 18}")case  pt: Point => println("  ${pt.toString()}")println("  Distance from origin: ${sqrt((pt.x * pt.x + pt.y * pt.y))}")case st: Status =>let message = match (st) {case Status.Active  => "System is running"case Status.Inactive => "System is stopped"case Status.Pending  => "System is waiting"}println("  Message: ${message}")case t: (Int64, Int64) => println("  Tuple: (${t[0]}, ${t[1]})")println("  Sum: ${t[0] + t[1]}")case _ => println("  Unknown type")}println("---")
}// 异构容器示例。这个有问题,解决见下面
// class Container {
//     private var items: Array<Any> = Array<Any>()   //     public func add(item: Any) {
//         items.append(item)
//     }//     public func getAll(): Array<Any> {
//         return items
//     }//     public func printAll() {
//         println("Container has ${items.size} items:")
//         for (i in 0..items.size) {// println("  [${i}]: ${items[i]}")  //报错!!!
//         }
//     }
// }// 异构容器示例
class Container {private var items: ArrayList<Any> = ArrayList<Any>()public func add(item: Any) {items.add(item)}public func getAll(): ArrayList<Any> {return items}public func printAll() {println("Container has ${items.size} items:")for (i in 0..items.size) {  //  避免越界let itemStr = anyToString(items[i]) // ?!println("  [${i}]: ${itemStr}")}}}// 全局函数,将 Any 转换为字符串
func anyToString(value: Any): String {match (value) {case  i: Int64 => return i.toString()case  f: Float64 => return f.toString()case  s: String => return scase  b: Bool => return if (b) { "true" } else { "false" }case  p: Person => return p.toString()  // 处理 Person 类型case  pt: Point => return pt.toString()  // 处理 Point 类型case  st: Status => return st.toString() // 处理 Status 枚举case _ => return "unknown type"}
}// 通用的比较函数
func compareAny(a: Any, b: Any): Bool {match ((a, b)) {case  (x: Int64, y: Int64) => return x == ycase  (x: Float64, y: Float64) => return x == ycase  (x: String, y: String) => return x == ycase  (x: Bool, y: Bool) => return x == ycase _ => return false}
}main() {println("=== Any Interface Demo ===\n")// 1. 基本类型作为 Anyprintln("1. Basic types as Any:")var anyVar: Any = 42printValue(anyVar)anyVar = 3.14159printValue(anyVar)anyVar = "Hello, Cangjie!"printValue(anyVar)// 2. 自定义类型作为 Anyprintln("\n2. Custom types as Any:")anyVar = Person("Alice", 25)printValue(anyVar)anyVar = Point(3.0, 4.0)printValue(anyVar)anyVar = Status.ActiveprintValue(anyVar)// 3. 元组作为 Anyprintln("\n3. Tuple as Any:")anyVar = (10, 20)printValue(anyVar)// 4. 异构容器示例println("\n4. Heterogeneous container:")let container = Container()container.add(100)container.add("Cangjie")container.add(Person("Bob", 30))container.add(Point(1.0, 2.0))container.add(true)container.add(Status.Active)container.printAll() // 打印所有项// 5. Any 类型的比较println("\n5. Comparing Any values:")let a1: Any = 42let a2: Any = 42let a3: Any = "42"println("42 == 42: ${compareAny(a1, a2)}")println("42 == '42': ${compareAny(a1, a3)}")// 6. Any 数组的处理println("\n6. Processing Any array:")let mixedArray: Array<Any> = [1, 2.5, "three", Person("Charlie", 35),Point(5.0, 12.0),Status.Pending]println("Mixed array contains ${mixedArray.size} elements")// 统计不同类型的数量var intCount = 0var floatCount = 0var stringCount = 0var otherCount = 0for (item in mixedArray) {match (item) {case _: Int64 => intCount++case _: Float64 => floatCount++case _: String => stringCount++case _ => otherCount++}}println("Type statistics:")println("  Integers: ${intCount}")println("  Floats: ${floatCount}")println("  Strings: ${stringCount}")println("  Others: ${otherCount}")return 0
}

运行输出:

=== Any Interface Demo ===

1. Basic types as Any:
Value type:
  Integer: 42
  Double value: 84    
---
Value type:
  Float: 3.141590
  Squared: 9.869588
---
Value type:
  String: 'Hello, Cangjie!'
  Length: 15
---

2. Custom types as Any:
Value type:
  Person(name: Alice, age: 25)
  Is adult: true
---
Value type:
  Point(x: 3.000000, y: 4.000000)
  Distance from origin: 5.000000
---
Value type:
  Message: System is running
---

3. Tuple as Any:
Value type:
  Tuple: (10, 20)
  Sum: 30
---

4. Heterogeneous container:
Container has 6 items:
  [0]: 100
  [1]: Cangjie
  [2]: Person(name: Bob, age: 30)
  [3]: Point(x: 1.000000, y: 2.000000)
  [4]: true
  [5]: Active

5. Comparing Any values:
42 == 42: true
42 == '42': false

6. Processing Any array:
Mixed array contains 6 elements
Type statistics:
  Integers: 1
  Floats: 1
  Strings: 1
  Others: 3

附录、官方相关文档https://cangjie-lang.cn/docs?url=%2F1.0.0%2Fuser_manual%2Fsource_zh_cn%2Fclass_and_interface%2Finterface.html

http://www.lryc.cn/news/621260.html

相关文章:

  • Video-R1论文解读
  • 使用keil5 自带的仿真观察GPIO口波形
  • lib.dom.d.ts
  • 《量子雷达》第4章 量子雷达的检测与估计 预习2025.8.14
  • Windows bypassUAC 提权技法详解(一)
  • ACCESS多个时间段查询,只取整点,30分数据
  • 【读代码】深度解析 context-engineering-intro:开源上下文工程实践原理与应用
  • 【Functions】enumerate的用法
  • 机器学习-基础入门:从概念到核心方法论
  • Data Augmentation数据增强
  • 从0到1:C++ 语法之 nullptr
  • 机器学习内容总结
  • 机器学习初学
  • 前端vue框架
  • 机器学习知识总结
  • 智能体评测技术与实践:从评估维度到DeepEval实战指南
  • 20250814,通义万相,无限生成权限(慢速)
  • Linux中的日志管理
  • Linux中tty与8250-uart的虐恋(包括双中断发送接收机制)
  • 前端包管理工具
  • hive加载csv中字段含有换行符的处理方法
  • Spring-cloud-openfeign-设置超时时间
  • 数据结构:用两个栈模拟队列(Queue Using 2 Stacks)
  • 8.14网络编程——TCP通信基础
  • 【22-决策树】
  • 零基础-动手学深度学习-10.3. 注意力评分函数
  • 20道CSS相关前端面试题及答案
  • torch.nn中Sequential的使用
  • 【代码随想录day 20】 力扣 538.把二叉搜索树转换为累加树
  • CMake语法与Bash语法的区别