Вы находитесь на странице: 1из 10

Ring Documentation, Release 1.5.

95.21 Is there constructor methods in Ring?

When you create new object for example


new point

1 - Ring will allocate dynamic memory space to be used for the new object attributes that Ring doesn’t know anything
about them.
2 - Ring will change the current local scope and the current object scope to use the object state created in step (1)
3 - Ring will move the execution to the class Region (After the class name and before any methods)
4 - Any Instructions/Code in the class region will be executed as any Ring code
5 - Control is moved from the class region to the location of (new point) once we reach the end of the class region or
we uses a Return command.
So All attributes that added to the object are dynamic attributes, this mean that you can control what attributes will be
added through the runtime.
Example:
$3D = False
see new point
$3D = True
see new point

class point
x y
if not $3D return ok
z

Output:
x: NULL
y: NULL
x: NULL
y: NULL
z: NULL

You have an option to call init() method directly when you create a new object
This method can do anything with the object attributes as it will be called after creating the object and executing the
class region code.
p1 = new point3d(100,200,300)
see p1

class point3d
x y z
func init p1,p2,p3
x=p1 y=p2 z=p3

95.22 What happens when we create a new object?

1- When you create an object, the class region code will be executed and you will have the object attributes based on
the code in that region

95.21. Is there constructor methods in Ring? 1705


Ring Documentation, Release 1.5.1

2- Ring don’t care about the object methods until you start calling a method
3- When you call a method, Ring will check the object class and the class parent (if you are using inheritance) and
will collect the methods for you to be used now or later from any object that belong to the same class.
4- Since methods are dynamic and each object get the method from the class, you can after creating objects, add new
methods and use it with the object or any object created or will be created from the same class.
Example:
o1 = new point {x=10 y=20 z=30}
o2 = new point {x=100 y=200 z =300}

addmethod(o1,"print", func { see x + nl + y + nl + z + nl } )

o1.print()
o2.print()

class point x y z

Output:
10
20
30
100
200
300

95.23 Can we use the attributes by accessing the Getter and Setter
methods?

Yes we can, The setter/getter methods are called automatically when you start using the attributes from outside the
class Also you can call the methods instead of using the attributes. It’s your choice.
Example:
o1 = new Developer
o1.name = "Mahmoud" see o1.name + nl
o1 { name = "Gal" see name }
o1 { name = "Bert" see name }

o1.setname("Marino")
see o1.getname()

Class Developer

name language = "Ring Programming Language"

func setname value


see "Message from SetName() Function!" + nl
name = value + " - " + language

func getname
see "Message from GetName() Function!" + nl + nl
return "Mr. " + name + nl

Output

95.23. Can we use the attributes by accessing the Getter and Setter methods? 1706
Ring Documentation, Release 1.5.1

Message from SetName() Function!


Message from GetName() Function!

Mr. Mahmoud - Ring Programming Language

Message from SetName() Function!


Message from GetName() Function!

Mr. Gal - Ring Programming Language


Message from SetName() Function!
Message from GetName() Function!

Mr. Bert - Ring Programming Language


Message from SetName() Function!
Message from GetName() Function!

Mr. Marino - Ring Programming Language

95.24 Why should a search of global names be made while defining


the class attributes?

The question is why we don’t avoid conflicts with global variable names when we define the class attributes ?
At first remember that using the optional $ mark in the global variables names solve the problem. Also using the Main
function and avoiding global variables may help.
The Answer:
Ring is a dynamic language
We can in the run-time determine the class attributes (Add/Remove)
We can execute (any code) while defining the class attributes
Example (1)
oPerson = new Person
Class Person
See "Welcome to the Ring language"

Example (2)
Customize attributes based on global variable value
$debug = true
oPerson = new Person
see oPerson
Class Person
if $debug date=date() time=time() ok

In the previous example when we have the $debug flag set to true, we will add the Date and Time attributes to the
object state.
Example (3)
Store the object index based on global variable

95.24. Why should a search of global names be made while defining the class attributes? 1707
Ring Documentation, Release 1.5.1

$ObjectsCount = 0
oPerson = new Person
see oPerson
oPerson2 = new Person
see oPerson2
Class Person
$ObjectsCount++
nIndex = $ObjectsCount

Output:
nindex: 1.000000
nindex: 2.000000

Common Example:
• Connect to the database then get table columns (Using global Variable/Object).
• Create class attributes based on the column names.
• Later when you modify the database - you may don’t need to modify your code.
It’s flexibility but remember that power comes with great responsibility.

95.25 Why Ring doesn’t avoid the conflict between Global Variables
and Class Attributes Names?

In this use case we have


1 - Global Variable defined without a special mark like $
2 - Class contains Attributes defined using a special syntax (where we type the attribute name directly after the class)
3 - The Attributes are defined in the class region that allows writing code and using global variables
If I will accepted your proposal about changing how Ring find variables in the class region I must break one of the
previous three features which will lead to more problems that are more important than this problem.
I don’t like changing the feature number (1) because I would like to keep Ring code more clean and let the programmer
decide when to use $ or not.
I don’t like changing the feature number (2) because I like this feature and I don’t like forcing the programmer to type
self.attribute
I don’t like changing the feature number (3) because it’s very important in many applications to access global variables
in the class region.
So what was my decision ?
I decided to leave this case for the programmer who will decide what to do to avoid this special case
1 - The programmer can avoid using global variables (Better) and can use the Main function (Optional)
2 - The programmer can use $ before the variable name or any mark like global_ or g_
3 - The programmer can use self.attribute after the class name to define the attributes
In general, for small programs you can use global variables and functions. For large programs, use classes and objects
and small number of global variables or avoid them at all.

95.25. Why Ring doesn’t avoid the conflict between Global Variables and Class Attributes Names?
1708
Ring Documentation, Release 1.5.1

95.26 Where can I write a program and execute it?

Run the Ring Notepad where you can write/execute programs.


If you want to run programs using the command line
Add Ring/bin folder to the path then

95.27 How to get the file size using ftell() and fseek() functions?

The next function can be used to get the file size without reading the file!
func getFileSize fp
C_FILESTART = 0
C_FILEEND = 2
fseek(fp,0,C_FILEEND)
nFileSize = ftell(fp)
fseek(fp,0,C_FILESTART)
return nFileSize

Note: The previous function take the fp (file pointer) as parameter, We can get the fp from opening the file using
fopen() function.

fp = fopen("filename","r")

see "File Size : " + getFileSize(fp) + nl

Another solution (Read the file)


see len(read("filename"))

95.28 How to get the current source file path?

We can use the next function to get the current source file path then we can add the path variable to the file name
cPath = CurrentPath()
func currentpath
cFileName = filename()
for x = len(cFileName) to 1 step -1
if cFileName[x] = "/"
return left(cFileName,x-1)
ok
next
return cFileName

95.29 What about predefined parameters or optional parameters in


functions?

if you want to use predefined parameters or optional parameters Just accept a list that works like hash/dictionary
Example

95.26. Where can I write a program and execute it? 1709


Ring Documentation, Release 1.5.1

sum([ :a = 1, :b = 2])
sum([ :a = 1 ])
sum([ :b = 2 ])
func sum pList
if plist[:a] = NULL pList[:a] = 4 ok
if plist[:b] = NULL pList[:b] = 5 ok
see pList[:a] + pList[:b] + nl

Output
3
6
6

95.30 How to print keys or values only in List/Dictionary?

If you want to print keys only or values only just select the index of the item (one or two).
Example
C_COUNTRY = 1
C_CITY = 2
mylist = [
:KSA = "Riyadh" ,
:Egypt = "Cairo"
]

for x in mylist
see x[C_COUNTRY] + nl
next

for x in mylist
see x[C_CITY] + nl
next

Output
ksa
egypt
Riyadh
Cairo

95.31 Why I get a strange result when printing nl with lists?

In the next code


list = 1:5 # list = [1,2,3,4,5]
see list + nl

New Line will be added to the list then the list will be printed, the default print of the lists will print a newline at the
end, You added new newline and You have now 2 newlines to be printed.
See <Expr>

The see command just print the final result of the expression, the expression will be evaluated as it

95.30. How to print keys or values only in List/Dictionary? 1710


Ring Documentation, Release 1.5.1

nl = char(13) + char(10) # just a variable that you can change to anything !

The + is an operator
string + string ---> new string
string + number ---> new string
number + number ---> new number
number + string ---> new number

list + item —> nothing new will be created but the item will be added to the same list
Exception
number + nl ?> New String
This exception is added to easily print numbers then new line.
No need for this with printing lists because after printing the last item we already get a new line.

95.32 Could you explain the output of the StrCmp() function?

At first remember that you can check strings using ‘=’ operator directly.
see strcmp("hello","hello") + nl +
strcmp("abc","bcd") + nl +
strcmp("bcd","abc") + nl

if the two strings are the same then it returns 0


abc and bcd aren’t the same. in the second line it returns -1 and in the third line it returns 1
In the second line we compare between “abc” and “bcd”
Not equal because the first letter in “abc” = “a” and the first letter in “bcd” = “b”
So we have “a” != “b” and “a” < “b”
So we get output = -1
In the third line we have “bcd” and “abc”
the first letter in “bcd” is “b” and the first letter in “abc” is “a”
So we have “b” != “a” and “b” > “a”
So we get output = 1

Note: ASCII(“a”) = 97 and ASCII(“b”) = 98 So “a” < “b” because 97 < 98

95.33 How to use many source code files in the project?

Example:
I have the next folder
C:\LRing

Contains the next files

95.32. Could you explain the output of the StrCmp() function? 1711
Ring Documentation, Release 1.5.1

C:\LRing\t1.ring
C:\LRing\mylib.ring
C:\LRing\libs\mylib2.ring

The file t1.ring contains the next code


load "mylib.ring"
load "libs\mylib2.ring"
myfunc()
test()

The file mylib.ring contains the next code


func myfunc
see "message from myfunc"+nl

The file libsmylib2.ring contains the next code


func test
see "message from test" + nl

from the folder C:LRing


If Ring is not added to the path you can add it or use the next command
set path=%path%;c:\ring\bin;

Where c:ring is the Ring folder


Now run
Ring t1.ring

Output
message from myfunc
message from test

95.34 Why this example use the GetChar() twice?

The GetChar() function accept one character from the keyboard buffer
In this example
While True
See "
Main Menu
(1) Say Hello
(2) Exit
"
Option = GetChar()
GetChar() GetChar() # End of line
# the previous two lines can be replaced with the next line
# Give Option

if Option = 1
see "Enter your name : " give cName
see "Hello " + cName
else

95.34. Why this example use the GetChar() twice? 1712


Ring Documentation, Release 1.5.1

bye
ok
End

We uses GetChar() Three times


The first time we get the user option
Option = GetChar()

But in the second and the third times (We accept the new line characters from the buffer)
GetChar() GetChar() # End of line

Example : when the user select the option number 1 then press ENTER
We have Three Characters
• The first character is : Number 1
• The second character is : CHAR(13)
• The third character is : CHAR(10)
Because Windows uses CHAR(13) and CHAR(10) for each new line ( i.e. CR+LF )

95.35 How to use NULL and ISNULL() function?

when we try to use uninitialized variable in the Ring programming language, we get a clear runtime error message
Example
See x

Output
Line 1 Error (R24) : Using uninitialized variable : x
in file tests\seeuninit.ring

The same happens when you try to access uninitialized attributes


Example
o1 = new point
see o1
see o1.x
class point x y z

Output
x: NULL
y: NULL
z: NULL

Line 3 Error (R24) : Using uninitialized variable : x


in file tests\seeuninit2.ring

if you want to check for the error, just use Try/Catch/End

95.35. How to use NULL and ISNULL() function? 1713


Ring Documentation, Release 1.5.1

Try
see x
Catch
See "Sorry, We can't use x!" + nl
Done

Output
Sorry, We can't use x!

Now we will talk about NULL and ISNULL()


Since we get error message when we deal with uninitialized variables
We can check these errors using Try/Catch/Done, So we uses NULL and ISNULL() for dealing with Strings.
NULL is a variable contains an empty string
ISNULL() is a function that returns true (1) if the input is an empty string or just a string contains “NULL”
This because we need to test these values (empty strings) and strings contains “NULL” that sometimes come from
external resource like DBMS.
Example
See IsNull(5) + nl + # print 0
IsNull("hello") + nl + # print 0
IsNull([1,3,5]) + nl + # print 0
IsNull("") + nl + # print 1
IsNull("NULL") # print 1

95.36 How to print lists that contains objects?

In this example we will see how we can print a list contains objects.
aList = [[1,2,3] , new point(1,2,3), new point(1,2,3)]
see "print the list" + nl
see alist
see "print the item (object)" + nl
see alist[2]
class point x y z
func init p1,p2,p3 x=p1 y=p2 z=p3

Output
print the list
1
2
3
x: 1.000000
y: 2.000000
z: 3.000000
x: 1.000000
y: 2.000000
z: 3.000000
print the item (object)
x: 1.000000
y: 2.000000
z: 3.000000

95.36. How to print lists that contains objects? 1714

Вам также может понравиться