跳转到内容

环/课程/反射和元编程

来自维基教科书,开放世界中的开放书籍
<

反射和元编程

[编辑 | 编辑源代码]

由于 Ring 编程语言是一种动态语言,我们可以在运行时获取有关程序代码的信息,并修改代码。

在本章中,我们将学习有关反射和元编程的概念,以及可用的函数。

locals() 函数

[编辑 | 编辑源代码]

我们可以使用 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() 函数获取全局作用域中变量名称的列表。

语法

	
	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() 函数

[编辑 | 编辑源代码]

我们可以使用 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() 函数

[编辑 | 编辑源代码]

我们可以使用 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() 函数检查变量是否在本地作用域中定义。

语法

	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() 函数检查变量是否在全局作用域中定义。

语法

	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() 函数

[编辑 | 编辑源代码]

我们可以使用 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() 函数

[编辑 | 编辑源代码]

我们可以使用 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() 函数获取包名称的列表。

语法

	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() 函数检查包是否已定义。

语法

	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() 函数获取类名称的列表。

语法

	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() 函数检查类是否已定义。

语法

	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() 函数获取包中类名称的列表。

语法

	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() 函数检查类是否在包中定义。

语法

	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() 函数获取对象的类名

语法

	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() 函数

[编辑 | 编辑源代码]

我们可以使用 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() 函数获取对象的属性

语法

	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() 函数测试对象是否包含一个属性

语法

	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() 函数测试对象是否包含一个私有属性

语法

	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() 函数测试对象的类是否包含一个方法

语法

	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() 函数测试对象的类是否包含一个私有方法

语法

	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() 函数向对象状态(而不是类)添加一个属性(或一组属性)

语法

	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() 函数向对象的类添加一个方法。这个方法可以与来自同一类的任何对象一起使用。

语法

	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() 函数获取对象的属性值

语法

	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() 函数设置对象的属性值

语法

	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() 函数在类之间共享方法,而无需继承

这个函数将类方法合并到另一个类中。

语法

	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
	********************


华夏公益教科书