如何将代码块存储在变量中,并在需要时调用它并获取其返回值?

类固醇

我正在Smalltalk中进行一些文字冒险。它由“屏幕”组成,这些文本包含其文本和其他屏幕的选择。由于我希望游戏具有动态性,因此我也希望包含分支。例如,如果玩家在一个铁匠铺上想要购买一把斧头,那么该玩家的屏幕将立即检查玩家是否有足够的钱,并根据该屏幕跳至其他两个屏幕之一。

我已经开始工作了:屏幕(名为的类Place)具有一个列表,其中第一项是函数,随后的项是参数。但是,我这样做的方式非常丑陋:第一个项目是一个字符串,然后将其与大型“ action”方法进行比较,因此它看起来像这样:
game data method:

blacksmith := Place new.
blacksmith choiceText: 'I would like an axe.';
blacksmith action add: 'money'; add: 20; add: blacksmith_good; add: blacksmith_bad.

动作方法:(currentScreen也是一个Place;该类还包含BranchMoney执行实际决策方法)

(currentScreen action at: 1) = 'money'
ifTrue: [
    currentScreen := (currentScreen BranchMoney)
]

这显然不是理想的,我想通过执行以下操作来压缩它:
游戏数据方法:

blacksmith action add: [blacksmith BranchMoney]; add: 20; add: blacksmith_good; add: blacksmith_bad.

动作方法:

currentScreen := (currentScreen action at: 1)

这样一来,不用字符串检查,游戏就可以直接使用我想要的方法进行游戏了。

但是,它似乎不起作用-我尝试对代码进行不同的更改,问题似乎是该currentScreen := (currentScreen action at: 1)行只是用代码块内容替换了currentScreen的内容–它不计算该块的内容,并且使用类型为的结果值Place

我尝试在游戏数据方法中使用圆括号–抛出一个超出范围的异常列表,因为它试图在甚至添加其他参数之前立即计算表达式。将游戏数据方法中的第一个项目名称更改为currentScreen BranchMoney似乎没有什么不同。
我还尝试过在游戏数据方法中添加return,例如:blacksmith action add: [^blacksmith BranchMoney],这样它将有返回值,没有运气。currentScreen := [^currentScreen action at: 1]在action方法中执行类似操作也不起作用。
对于黑暗中的一些镜头,我尝试了ExternalProcedure callcall:方法,但这也失败了。

莱安德罗·坎尼利亚

在Smalltalk中,每个块都是一个常规对象,可以存储和检索与其他任何对象相同的对象:

b := [self doSomething]

存储在b块中(就像在中b := 'Hello'存储字符串一样b)。我认为您所缺少的是#value信息。要执行该块,请执行以下操作

b value   "execute self doSomething and answer with the result"

如果您的块有一个参数,请#value:改用

b := [:arg | self doSomethingWith: arg]

稍后的

b value: 17   "execute the block passing 17 as the argument"

(对于两个参数#value:value:,对于三个#value:value:value:和许多#valueWithArguments:。)

但是请注意,这种使用参数的块和数组的方法看起来并不十分优雅(甚至不方便)。但是,为了帮助您找到更好的选择,我们需要更多地了解您的游戏。因此,请检查一下#value(和朋友)是否可以让您有所进步,并随时可以在这里提出下一个问题。经过几次迭代后,我们可以指导您找到更清晰的路线。


b := [:m | m < 20 ifTrue: ['bad'] ifFalse: ['good']].

将产生

b value: 15 "==> 'bad'"
b value: 25 "==> 'good'"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将未来的返回值存储在变量中?

如何将变量传递到javascript中的特定html页面并在该页面上需要时调用该变量

如何将ajax请求放入函数中并在必要时调用它?

从存储过程中获取返回值并在程序中使用它

如何将函数的返回值存储在 react-native 的变量中

将返回值存储在变量中

如何将两个函数返回值分配给两个变量并在同一行中使用它们?

java - 如何将返回值传递给方法并在java android改造中获取响应值

在调用它的函数中获取函数的返回值

如何将数据存储在单个文件中并在视图文件中调用它?

如何将命令存储在变量中并在管道中使用它?

哪个内存消耗调用一个方法两次或将值存储在变量中并在需要时使用它?

将存储过程的返回值存储在变量中

如何将NSArray.objectAtIndex的返回值存储到NSString变量

在ruby方法块中,如何获取分配给方法返回值的变量名

PHP如何将变量存储在数组中并调用它们

如何将AJAX调用的返回值绑定到Angular $ scope变量

如何将带有参数的函数的返回值存储在变量中?

如何将存储过程的返回值用作列中的默认值?

从Unity中的另一个脚本调用IEnumerator方法并获取其返回值

在我自己的Angular服务中,如何将返回值返回给调用该服务的Controller?

如何将异步任务存储在字典中并根据配置值调用它们?

如何将JavaScript函数的返回值获取到Python变量

如何在rspec存根中获取块的返回值?

如何将表达式存储在变量中并在单个MySQL查询中重用它们

如何在Slick中调用存储过程并获取返回值(使用Scala)

将subprocess.call()返回值存储在变量中

将函数返回值存储到变量中

如何获取Laravel块的返回值?