Rholang 教程

From RChain Developer Resource

Rholang程序是完全异步的,由消息传输机制驱动执行。

Rholang的调试环境参考Rholang 运行环境

Hellp World![edit | edit source]

经典Hello World的示例,以下代码将在屏幕上输出Hello World!

1new stdout(`rho:io:stdout`) in {
2    stdout!("Hello World")
3}

new stdout(`rho:io:stdout`)表示创建一个name (名字空间),而且该名字绑定了标准库中的终端输出函数。

大括号声明了一个作用域,之前创建的stdout在该作用域内生效。

stdout!("Hello World")表示向stdout名字空间中发送Hello World字符串。

数据类型[edit | edit source]

基本数据类型[edit | edit source]

Rholang的基本数据类型有以下几种:Integer, Boolean。Rholang没有浮点数,如果需要浮点运算,一种思路是将数字放大后用整数运算并存储。

Integer 整数[edit | edit source]

Rholang的整数是64位整数,即其数据范围在[-263+1, 263-1]之间,即[-9223372036854775807, 9223372036854775807]之间。超过此范围会溢出,测试下面的代码:

new stdout(`rho:io:stdout`) in {
    stdout!(("-9223372036854775807", -9223372036854775807))
    |
    stdout!(("9223372036854775807", 9223372036854775807))
    |
    stdout!(("-9223372036854775807 - 1", -9223372036854775807 - 1))
    |
    stdout!(("-9223372036854775807 - 2", -9223372036854775807 - 2))
    |
    stdout!(("9223372036854775807 + 1", 9223372036854775807 + 1))
}

输出结果为(并发执行,顺序不重要):

("-9223372036854775807", -9223372036854775807)
("9223372036854775807", 9223372036854775807)
("-9223372036854775807 - 1", -9223372036854775808)
("-9223372036854775807 - 2", 9223372036854775807)
("9223372036854775807 + 1", -9223372036854775808)

-9223372036854775807 - 1 未溢出,其结果-9223372036854775808,因为int在实现时使用的是JVM中的Long值,因此最小值为-9223372036854775808,但不能直接使用字面值-9223372036854775808,会报输入异常。

-9223372036854775807 - 2 溢出,变为正数。

9223372036854775807 + 1 溢出,变为负数。

Boolean 布尔值[edit | edit source]

字面值只有两个:true, false。示例:

new stdout(`rho:io:stdout`) in {
    stdout!(true)
    |
    stdout!(false)
}

输出(并发执行,顺序不重要):

true
false

数据结构[edit | edit source]

Rholang支持的数据结构包括:String, Tuple, List, Set, Map.

String[edit | edit source]

String是字符串,"test"即是一个String。教程最开始的Hello World程序片段即为字符串输出的一个示例。

下面是String支持的操作。

字符中连接[edit | edit source]

两个String之间可以用++连接,如下:

1new stdout(`rho:io:stdout`) in {
2    stdout!("Hello " ++ "World")
3}

输出:Hello World

字符串切片[edit | edit source]

可以通过String.slice(start, exclusiveEnd)获取字符串的一部分内容,start为截取起始的索引,从0开始,exclusiveEnd截取结尾的索引(不包含在内)。

例如:

1new stdout(`rho:io:stdout`) in {
2    stdout!("Hello World".slice(0, 5))
3}

输出Hello。

当exclusiveEnd超过字符串长度时以字符串长度为准。

当start, exlusiveEnd出现负数时,也不会报异常,均会被修正为0。

当start大于exclusiveEnd时返回空字符串。

如:

"Hello World".slice(0, 100) // "Hello World"
"Hello World".slice(-100, 5) // "Hello"
"Hello World".slice(-200, -100) // ""
"Hello World".slice(5, 1)  // ""

字符串插值[edit | edit source]

可以将字符串中用${}包围的字符串替换为字典中相应键对应的值。如:

"${greeting} World" %% {"greeting": "Hello"}

${greeting}Hello替换。

1new stdout(`rho:io:stdout`) in {
2    stdout!("${greeting} World" %% {"greeting": "Hello"})
3}

输出:Hello World

十六进制字符串转换为字节[edit | edit source]

可以将内容为十六进制字符的字符串转换为字节数组。用来存储数据时可以使用。

1new stdout(`rho:io:stdout`) in {
2    stdout!("0A".hexToBytes()) |
3    stdout!("0A".hexToBytes().length())
4}

输出:

0a
1

Tuple(元组)[edit | edit source]

Tuple 是用小括号()包围起来的元素的集合,其内的元素可以是不同类型的数据。比如以下内容内容均是Tuple:

(1, 2, 3)
(1, "test", (3, 4, 4))
(1, Nil, 3]

下面是Tuple支持的操作:

nth 获取第n个元素[edit | edit source]

Tuple.nth(index)表示从以0为开始的索引index位置获取相应元素。

下面表示获取索引为2的元素:

(1, 2, 3).nth(2)

输出为3。

List(列表)[edit | edit source]

List是包含不同元素的列表,与Tuple相似,但支持更多的操作。列表字面值用[]包围,以下内容内容均是List:

[1, 2, 3]
[1, "test", [3, 4, 4]]
[1, Nil, 3]

Warning icon.png : List与Tuple的区别是什么?理论上说List可以完成替代Tuple

下面为List支持的操作:

length 获取List长度[edit | edit source]

[1, "test", [3, 4, 4]].length()

输出3。

nth 获取第n个元素[edit | edit source]

List.nth(index)表示从以0为开始的索引index位置获取相应元素。

下面表示获取索引为2的元素:

[1, 2, 3].nth(2)

输出为3。

slice 获取部分元素[edit | edit source]

可以通过List.slice(start, exclusiveEnd)获取列表的一部分元素,start为截取起始的索引,从0开始,exclusiveEnd截取结尾的索引(不包含在内)。

[1, 2, 3].slice(1, 2)

输出:[2]

Set 集合[edit | edit source]

Set是一种不包含重复元素的集合,而且不像Tuple和List一样可以保留元素的顺序,Set是无法保留元素顺序的。

下面均为有效的Set:

Set(1, 2)
Set([1, 2], [1, 2], Nil, 2)

name 与 process[edit | edit source]

name和process是Rholang中非常关键的两个概念,Rholang是通过消息传输机制驱动的。

name表示名字空间,也可以称为channel(通道),是用来接收消息的。name可以转换为process。

process可以是Rholang中任何一个代码片段。process可以是上百行的大程序,也可以只有几行。它们甚至可以是用于表示值的代码。

在Rholang中,我们需要记住的是发送“process”和接收“name”。这很重要,因此我再次强调。你总是发送一个“process”,在另一端接收一个“name”

参考文献[edit | edit source]

许可[edit | edit source]

本文使用Apache 2.0 许可