内容简介:上周继续改写 Python 文字冒险游戏第十二章,期间发现个木兰编程语言在引用功能上的特别之处。 起因是这样。在 世界.ul 中添加了随机敌人: type 敌人位置 : 地块 { func $敌人位置(x, y) { 随机...
上周继续改写 Python 文字冒险游戏第十二章,期间发现个木兰编程语言在引用功能上的特别之处。
起因是这样。在 世界.ul
中添加了随机敌人:
type 敌人位置 : 地块 {
func $敌人位置(x, y) {
随机 = random.random()
if 随机 < 0.50 {
$敌人 = ch12.敌人.大蜘蛛()
$提示出现 = "一只大蜘蛛从它的网上跳到你面前!"
$提示死亡 = "死蜘蛛的尸体在地上发臭。"
} elif 随机 < 0.80 {
$敌人 = ch12.敌人.食人魔()
$提示出现 = "一个食人魔挡住了去路!"
$提示死亡 = "食人魔倒地,胜利!"
} elif 随机 < 0.95 {
$敌人 = ch12.敌人.蝙蝠群()
$提示出现 = "一阵尖锐的噪声逐渐变大……突然被一群蝙蝠团团包围!"
$提示死亡 = "数十只死蝙蝠散落在地。"
} else {
$敌人 = ch12.敌人.石头怪()
$提示出现 = "你惊醒了一只沉睡的石头怪!"
$提示死亡 = "怪物被打败,变回了普通石头。"
}
super.__init__(x, y)
}
func $介绍 {
return ($敌人.活着() ? $提示出现 : $提示死亡) + "\n"
}
func $影响(玩家) {
if $敌人.活着() {
玩家.血量 = 玩家.血量 - $敌人.攻击
println("敌人造成{}点伤害,你还有{}点血。".format($敌人.攻击, 玩家.血量))
}
}
}
地图 = [
[nil, 取胜位置(1,0), nil],
[nil, 敌人位置(1,1), nil],
[敌人位置(0,2), 起始位置(1,2), 敌人位置(2,2)],
[nil, 敌人位置(1,3), nil]
]
在原代码中,有两处引用此模块。结果发现两处得到的同一地点的敌人不同。用简化例子说明(更多测试见此 issue):
ran.ul 为被引用模块:
using random
r = random.random()
println("in ran: `r`")
m1.ul 引用 ran 中的 r:
using * in ran
println("in m1: `r`")
m2.ul 引用 m1 后引用了 ran:
using * in m1
using * in ran
println("in m2: `r`")
运行 木兰 m2.ul
输出如下:
in ran: 0.14259277701409412
in m1: 0.14259277701409412
in ran: 0.7840393404568102
in m2: 0.7840393404568102
就是说,在 m1 和 m2 都引用了 ran 模块时,ran 模块被运行了两次,导致在两处的 r 值不同。同样行为在原始 ulang-0.2.2.exe 中复现。而类似例程在 Python 下,ran 模块仅被运行一次,m1 和 m2 的 r 输出值相同。
虽然仍需深入研究,但至少现在看来木兰的如此引用规则意味着在多处引用同一模块时要特别注意。在上面的游戏例程中,是通过方法传参规避了一处引用,达到了同样游戏功能。
另外,本周用现有测试集对木兰的 PyPI 发布版本进行了全面测试(Mac 和 win7 下),结果发现其中有一个 测试/引用/引用本地包内py.ul
未通过(详见此处)。这是头次发觉 PyPI 发布版本与本地开发版的行为差别。作为参照物之一的 木兰演示版本 在 win7 下安装测试也有同样问题,仍需进一步调查。
以上所述就是小编给大家介绍的《木兰语言的引用相关功能与问题新发现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 论文浅尝 | 引入“引用”的语言模型
- 木兰语言多次引用模块的行为小结
- 智能合约基础语言(五):Solidity变量类型:引用类型
- go语言的 slice切片不是纯引用类型
- 现代编程语言的值传递与引用传递
- 木兰编程语言重现——儿歌查询实例,引用模块、字符串列表操作
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。