环/课程/反射和元编程
由于 Ring 编程语言是一种动态语言,我们可以在运行时获取有关程序代码的信息,并修改代码。
在本章中,我们将学习有关反射和元编程的概念,以及可用的函数。
我们可以使用 locals() 函数获取当前作用域中变量名称的列表。
语法
locals() --> a list contains the variables names in the current scope
示例
test("hello")
func test cMsg
see cMsg + nl
x = 10
y = 20
z = 30
see locals()
输出
hello
cmsg
x
y
z
我们可以使用 globals() 函数获取全局作用域中变量名称的列表。
语法
globals() --> a list contains variables names in the global scope
示例
x=10 y=20 z=30
test()
func test
see "message from test()" + nl +
"Global Variables:" + nl
see globals()
输出
message from test()
Global Variables:
x
y
z
我们可以使用 functions() 函数获取 Ring 语言中函数名称的列表。
语法
functions() --> a list contains functions names
示例
see functions()
func f1
see "f1" + nl
func f2
see "f2" + nl
func f3
see "f3" + nl
输出
f1
f2
f3
我们可以使用 cfunctions() 函数获取 C 语言中函数名称的列表。
语法
cfunctions() --> a list contains functions names
示例
aList = cfunctions()
See "Count : " + len(aList) + nl
for x in aList
see x + "()" + nl
next
输出
Count : 186
len()
add()
del()
get()
clock()
...
.. 注意:: 完整的列表已从之前的输出中移除。
我们可以使用 islocal() 函数检查变量是否在本地作用域中定义。
语法
islocal(cVariableName) --> returns 1 if the variable is defined in the local scope
returns 0 if the variable is not defined in the local scope
示例
test()
func test
x=10 y=20
see islocal("x") + nl +
islocal("y") + nl +
islocal("z") + nl
输出
1
1
0
我们可以使用 isglobal() 函数检查变量是否在全局作用域中定义。
语法
isglobal(cVariableName) --> returns 1 if the variable is defined in the global scope
returns 0 if the variable is not defined in the global scope
示例
x=10 y=20
test()
func test
see isglobal("x") + nl +
isglobal("y") + nl +
isglobal("z") + nl
输出
1
1
0
我们可以使用 isfunction() 函数检查 Ring 函数是否已定义。
语法
isfunction(cFunctionName) --> returns 1 if the Ring function is defined
returns 0 if the Ring function is not defined
示例
see isfunction("f1") + nl +
isfunction("f2") + nl +
isfunction("f3") + nl
func f1
see "message from f1()" + nl
func f2
see "message from f2()" + nl
输出
1
1
0
我们可以使用 iscfunction() 函数检查 C 函数是否已定义。
语法
iscfunction(cFunctionName) --> returns 1 if the C function is defined
returns 0 if the C function is not defined
示例
see iscfunction("len") + nl +
iscfunction("test") + nl
输出
1
1
0
我们可以使用 packages() 函数获取包名称的列表。
语法
packages() --> a list contains packages names
示例
See packages()
Package Package1
Class class1
Func f1
Package Package2
Class class1
Func f1
Package Package3
Class class1
Func f1
Package Package4
Class class1
Func f1
输出
package1
package2
package3
package4
我们可以使用 ispackage() 函数检查包是否已定义。
语法
ispackage(cPackageName) --> returns 1 if the Package is defined
returns 0 if the Package is not defined
示例
See ispackage("package1") + nl +
ispackage("package4") + nl +
ispackage("package5") + nl +
ispackage("package3") + nl
Package Package1
Class class1
Func f1
Package Package2
Class class1
Func f1
Package Package3
Class class1
Func f1
Package Package4
Class class1
Func f1
输出
1
1
0
1
我们可以使用 classes() 函数获取类名称的列表。
语法
classes() --> a list contains classes names
示例
See classes()
Class class1
Func f1
Class class2
Func f1
Class class3
Func f1
输出
class1
class2
class3
我们可以使用 isclass() 函数检查类是否已定义。
语法
isclass(cClassName) --> returns 1 if the Class is defined
returns 0 if the Class is not defined
示例
see isclass("class4") + nl +
isclass("class3") + nl +
isclass("class2") + nl
Class class1
func f1
class class2
func f1
class class3
func f1
输出
0
1
1
我们可以使用 packageclasses() 函数获取包中类名称的列表。
语法
packageclasses(cPackageName) --> a list contains classes names inside the package
示例
see "classes in Package1" + nl
see packageclasses("Package1")
see "classes in Package2" + nl
see packageclasses("Package2")
Package Package1
Class class1
Func f1
Package Package2
Class class1
Func f1
Class class2
Func f1
Class class3
func f1
输出
classes in Package1
class1
classes in Package2
class1
class2
class3
我们可以使用 ispackageclass() 函数检查类是否在包中定义。
语法
ispackageclass(cPackageName,cClassName) --> returns 1 if the Class is defined
returns 0 if the Class is not defined
示例
see ispackageclass("package1","class1") + nl +
ispackageclass("package1","class2") + nl +
ispackageclass("package2","class1") + nl +
ispackageclass("package2","class2") + nl
Package Package1
Class class1
Func f1
Package Package2
Class class1
Func f1
Class class2
Func f1
Class class3
func f1
输出
1
0
1
1
我们可以使用 classname() 函数获取对象的类名
语法
classname(object) --> Returns the object class name
示例
o1 = new point
o2 = new rect
see classname(o1) + nl # print point
see classname(o2) + nl # print rect
class point
class rect
我们可以使用 objectid() 函数获取对象 ID
语法
objectid(object) --> Returns the object id
示例
o1 = new point
see objectid(o1) + nl
test(o1)
func test v
see objectid(v) + nl
Class point x y z
输出
021B5808
021B5808
我们可以使用 isobject() 函数检查变量是否为对象。
语法
isobject(variable) --> Returns True if it's an object, False if it's not
我们可以使用 attributes() 函数获取对象的属性
语法
attributes(object) --> Returns a list contains the object attributes
示例
o1 = new point
aList = attributes(o1) # we can use see attributes(o1)
for t in aList see t next # print xyz
Class Point x y z
我们可以使用 methods() 函数获取对象的方法
语法
methods(object) --> Returns a list contains the object methods
示例
o1 = new test
aList = methods(o1)
for x in aList
cCode = "o1."+x+"()"
eval(cCode)
next
Class Test
func f1
see "hello from f1" + nl
func f2
see "hello from f2" + nl
func f3
see "hello from f3" + nl
func f4
see "hello from f4" + nl
输出
hello from f1
hello from f2
hello from f3
hello from f4
我们可以使用 isattribute() 函数测试对象是否包含一个属性
语法
isattribute(object,cAttributeName) --> Returns True if the object contains the attribute
示例
o1 = new point
see isattribute(o1,"x") + nl # print 1
see isattribute(o1,"t") + nl # print 0
see isattribute(o1,"y") + nl # print 1
see isattribute(o1,"z") + nl # print 1
class point x y z
我们可以使用 isprivateattribute() 函数测试对象是否包含一个私有属性
语法
isprivateattribute(object,cAttributeName) --> Returns True if the object
contains the private attribute
示例
o1 = new person
see isprivateattribute(o1,"name") + nl +
isprivateattribute(o1,"address") + nl +
isprivateattribute(o1,"phone") + nl +
isprivateattribute(o1,"job") + nl +
isprivateattribute(o1,"salary")
Class Person
name address phone
private
job salary
输出
0
0
0
1
1
我们可以使用 ismethod() 函数测试对象的类是否包含一个方法
语法
ismethod(object,cMethodName) --> Returns True if the object class contains the method
示例
o1 = new point
see ismethod(o1,"print") + nl # print 1
mylist = []
mylist + new point
see ismethod(mylist[1],"print") + nl # print 1
class point x y z
func print
see x + nl + y + nl + z + nl
我们可以使用 isprivatemethod() 函数测试对象的类是否包含一个私有方法
语法
isprivatemethod(object,cMethodName) --> Returns True if the object class contains
the private method
示例
o1 = new Test
see isprivatemethod(o1,"f1") + nl +
isprivatemethod(o1,"f2")
Class Test
func f1
see "message from f1()" + nl
private
func f2
see "message from f2()" + nl
输出
0
1
我们可以使用 addattribute() 函数向对象状态(而不是类)添加一个属性(或一组属性)
语法
AddAttribute(object,cAttributeName|aAttributesList)
示例(1)
see new point {x=10 y=20 z=30}
Class Point
AddAttribute(self,["x","y","z"])
示例(2)
o1 = new point
addattribute(o1,"x")
addattribute(o1,"y")
addattribute(o1,"z")
see o1 {x=10 y=20 z=30}
class point
输出
x: 10.000000
y: 20.000000
z: 30.000000
我们可以使用 addmethod() 函数向对象的类添加一个方法。这个方法可以与来自同一类的任何对象一起使用。
语法
AddMethod(Object,cNewMethodName,cMethodName|AnonymousFunction)
示例
o1 = new point { x=10 y=20 z=30 }
addmethod(o1,"print", func { see x + nl + y + nl + z + nl } )
o1.print()
Class point
x y z
输出
10
20
30
我们可以使用函数名称,而不是使用匿名函数来向类添加新方法
示例
o1 = new point { x=10 y=20 z=30 }
myfunc = func { see x + nl + y + nl + z + nl }
addmethod(o1,"print", myfunc )
addmethod(o1,"display", myfunc )
addmethod(o1,"show", myfunc )
o1.print()
o1.display()
o1.show()
Class point
x y z
输出
10
20
30
10
20
30
10
20
30
由于我们将方法添加到类中,因此来自该类的任何对象都可以使用此方法
示例
o1 = new point { x=10 y=20 z=30 }
o2 = new point { x=100 y=200 z=300 }
o3 = new point { x=50 y=150 z=250 }
addmethod(o1,"print", func { see x + nl + y + nl + z + nl } )
o1.print()
o2.print()
o3.print()
Class point
x y z
输出
10
20
30
100
200
300
50
150
250
我们可以使用 getattribute() 函数获取对象的属性值
语法
GetAttribute(oObject,cAttributeName) ---> Attribute Value
示例
o1 = new point
see getattribute(o1,"name") + nl +
getattribute(o1,"x") + nl +
getattribute(o1,"y") + nl +
getattribute(o1,"z") + nl
Class Point
x=10 y=20 z=30
name = "3D-Point"
输出
3D-Point
10
20
30
我们可以使用 setattribute() 函数设置对象的属性值
语法
SetAttribute(oObject,cAttributeName,Value)
示例
o1 = new person
setattribute(o1,"cName","Mahmoud")
setattribute(o1,"nSalary",1000000)
setattribute(o1,"aColors",["white","blue","yellow"])
see o1
see o1.aColors
Class Person
cName
nSalary
aColors
输出
cname: Mahmoud
nsalary: 1000000.000000
acolors: List...
white
blue
yellow
我们可以使用 MergeMethods() 函数在类之间共享方法,而无需继承
这个函数将类方法合并到另一个类中。
语法
MergeMethods(cClassNameDestination,cClassNameSource)
示例
mergemethods("count","share")
mergemethods("count2","share")
o1 = new count { test() }
o1 = new count2 { test() }
Class Share
func one
see "one" + nl
func two
see "two" + nl
func three
see "three" + nl
Class Display
Func printline
see copy("*",20) + nl
Class Count from Display
Func test
printline()
one()
two()
three()
printline()
Class Count2 from Display
Func test
three()
two()
one()
printline()
输出
********************
one
two
three
********************
three
two
one
********************