热烈欢迎新会员,新手报到帖maxscript BUG和技巧收集场景助手3.0下载飞浪脚本零起点入门
返回列表 发帖

在MAXScript中结构体背后的一个有趣的概念

翻译网址:http://blog.duber.cz/3ds-max/an- ... tructs-in-maxscript
水平有限,诸位见谅


我碰到了一个关于结构内部的引用值的问题,这个问题是当需要避免使用全局变量的情况下,在代码中如何使用变量的一个好的解决方案。这里面的问题太多了,因为我不知道在maxscript中的结构的具体实现设计是怎么一回事。


一般而言,相比我们所知的Python语言,结构体只是一个简化的自定义类。但是结构体是如此的简单以至于他都不需要实现继承相关的功能(个人觉得这也是一个遗憾),或者已经实现了一些相比Python中更为强大的功能。结构体他不同于类,他更像是一个组。这就是我使用它的主要原因。我把大量的函数打组并通过一个标准的属性实例范例来调用他们。以下是一个超级简单的结构体,封装了一个函数,用来打印出“HELLO WORLD”。

  1. struct tstStruct(        fn printHello =        (                print "HELLO WORLD"        ))
复制代码

你能通过以下的方式来调用这个函数
tstStruct.printHello()


对于大量的函数堆积在一个结构中,而且也没有命名空间或其他的东西参杂在里面,这是一种很方便的访问方式。但是在网站tech-artists.org上读了一篇关于时刻注意避免使用全局变量的文章后,我发现写一些更加清洁优雅和复杂的脚本是很有必要且势在必行的。但是由于我已经习惯了python类,并且我从未使用过结构体内部的变量,我碰到了一个我从未遇到的问题。当你在结构体中声明一个变量的时候,该变量不能直接从该结构的外部访问,而是首先,你必须初始化变量。下面的做法是错的
  1. struct tstStruct(        myVar = 0.,
  2.         fn printHello =        (                print "HELLO WORLD"        ))
复制代码

我简单的以为变量是存在的,并且我可以访问和修改它。但是我错了,你看,在结构体的声明之后访问变量myVar会抛出下面的错误:


-- Unknown property: "myVar" in #Struct:tstStruct(
  myVar:<data>,
  printHello:<fn>)


为了访问这些变量,我不知道我为什么必须要初始化结构体中的那些变量。问题在于结构体不提供诸如Python中的类似的特殊的方法(函数),例如我不能使用像 __init__ 函数【也就是说报这个错并不是因为maxscript中存在一些被占用的关键字,而使得他的脚本中的变量无法访问】;我抛弃了MAXScript reference文档去读了一些关于如何初始化这些变量的文章,我不得不将struct的值赋给一个新的对象并明确分配给变量,这么做起来非常不方便,但是不管如何,还是有办法可以实现它:


  1. struct tstStruct(        myVar = 0.,
  2.         fn printHello =        (                print "HELLO WORLD"        ))
  3. clsInst = tstStruct myVar:0.
复制代码

这样你就必须调用clsinst对象,才能访问所有函数和显式声明的变量
clsInst.myVar; clsInst.printHello()


现在如我所愿可以正常运行了,我能在我的脚本中使用结构体内部的变量访问和读取了,这是我学到的一个很好的做法。
现在让我们看看这些在python中是如何实现的。Python的类是非常好的,它提供诸如继承,多继承,和一些非常强大的功能和方法。但是在maxscript的结构体和Python的类中还是有一些相似性的,下面我们来看看:
  1. class tstClass:        myVar = 0.
  2.         def __init__(self):                self.testVal = 10.
  3.         def printHello(self):                print "HELLO WORLD"
复制代码

上面简单的代码示例声明了一个叫做tstClass的新的类,这个类包含一个变量myVar,一个强制实现的函数 __init__ 和一个自定义函数printHello,在功能上和maxscript是类似的。但是类和结构体之间的相似性体现在——当我直接调用类和访问myVar变量时,我得到了正确的值0.0,因为我还没有初始化类对象并且函数 __init__还没有被执行。相似性就在于类没有被初始化,但是我仍然能访问变量myVar并且Python不会报错。这就是我最初在maxscript中假设的那样。


然而,当我通过给予对象一个新的变量来初始化类时,我通过下面的代码段,执行了__init__函数并使用一个新值10.0覆盖了myVar:
  1. instCls = testClass()
  2. print testClass.testValprint instCls.testVal
复制代码

我获得了如下的结果:
0.0
10.0


这就是说没有被初始化的类的myVar值仍然是0.0,但是当类被初始化之后,变量被__init__函数赋予新的值,而变成10.0;可惜maxscript不为其结构体提供这些特殊方法,因而当结构体中存在大量的变量时,初始化结构体显得有点繁琐、不直观、不方便!


编者注:如 Mathieson指出的如下意见,实例化结构体时,你不需要显式访问变量。你真正需要的是保证正确地实例化结构体,然后你就可以访问结构体中的所有变量。再次感谢Mathieson指出的这一点!
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友


涨姿势了又,
第一次接触maxscript的结构体,
max的struct里使用了变量后就类似Python的类了,
要先实例化才能访问
飞浪脚本零起点入门1-12

TOP

在结构内部函数互相引用,然后调用结构时老出错,原来是没有实例化
飞浪脚本零起点入门1-12

TOP

返回列表