a = "the meaning of life" --> , <br/>
a = 42 -->
function repeater ( n, message ) <br/>
for i = 1 , n do <br/>
print ( message ) <br/>
end <br/>
end <br/>
<br/>
repeater ( 3 , "foo" ) --> foo <br/>
--> foo <br/>
--> foo
> repeater ("foo", 3) stdin: 2: 'for' limit must be a number stack traceback: stdin: 2: in function 'repeater' stdin: 1: in main chunk [C]:?
> repeater (3) nil nil nil
foo = { } <br/>
function foo:setn ( n ) <br/>
self.n_ = n<br/>
end <br/>
function foo:repeat_message ( message ) <br/>
for i = 1 , self.n_ do <br/>
print ( message ) <br/>
end <br/>
end <br/>
<br/>
foo:setn ( 3 ) <br/>
foo:repeat_message ( "bar" ) --> bar <br/>
--> bar <br/>
--> bar
foo = { } <br/>
foo.setn = function ( self, n ) <br/>
self.n_ = n<br/>
end <br/>
foo.repeat_message = function ( self, message ) <br/>
for i = 1 , self.n_ do <br/>
print ( message ) <br/>
end <br/>
end <br/>
<br/>
foo.setn ( foo, 3 ) <br/>
foo.repeat_message ( foo, "bar" ) --> bar <br/>
--> bar <br/>
--> bar
> foo.setn (3) stdin: 2: attempt to index local 'self' (a number value) stack traceback: stdin: 2: in function 'setn' stdin: 1: in main chunk [C]:? > foo.repeat_message ("bar") stdin: 2: 'for' limit must be a number stack traceback: stdin: 2: in function 'repeat_message' stdin: 1: in main chunk [C]:?
> (3) .n_ = nil
stdin: 1: attempt to index a number value stack traceback: stdin: 1: in main chunk [C]:?
> return ("bar"). n_ nil
> return getmetatable ("a") .__ index == string true
a = "A" <br/>
print ( string.rep ( a, 3 ) ) --> AAA <br/>
print ( a:rep ( 3 ) ) --> AAA <br/>
print ( ( "A" ) :rep ( 3 ) ) --> AAA
> return getmetatable ("a") .__ newindex nil > ("a") ._ n = 3 stdin: 1: attempt to index a string value stack traceback: stdin: 1: in main chunk [C]:?
> for i = 1, string ["n_"] do >> print ("bar") >> end stdin: 1: 'for' limit must be a number stack traceback: stdin: 1: in main chunk [C]:?
function repeater ( n, message ) <br/>
assert ( type ( n ) == "number" ) <br/>
assert ( type ( message ) == "string" ) <br/>
for i = 1 , n do <br/>
print ( message ) <br/>
end <br/>
end <br/>
> repeater (3, "foo") foo foo foo > repeater ("foo", 3) stdin: 2: assertion failed! stack traceback: [C]: in function 'assert' stdin: 2: in function 'repeater' stdin: 1: in main chunk [C]:? > repeater (3) stdin: 3: assertion failed! stack traceback: [C]: in function 'assert' stdin: 3: in function 'repeater' stdin: 1: in main chunk [C]:?
function repeater ( n, message ) <br/>
if type ( n ) ~ = "number" then <br/>
error ( <br/>
"bad n type: expected `number', got `" .. type ( n ) <br/>
2 <br/>
) <br/>
end <br/>
if type ( message ) ~ = "string" then <br/>
error ( <br/>
"bad message type: expected `string', got `" <br/>
.. type ( message ) <br/>
2 <br/>
) <br/>
end <br/>
<br/>
for i = 1 , n do <br/>
print ( message ) <br/>
end <br/>
end
> repeater (3, "foo") foo foo foo > repeater ("foo", 3) stdin: 1: bad n type: expected `number ', got` string' stack traceback: [C]: in function 'error' stdin: 3: in function 'repeater' stdin: 1: in main chunk [C]:? > repeater (3) stdin: 1: bad message type: expected `string ', got` nil' stack traceback: [C]: in function 'error' stdin: 6: in function 'repeater' stdin: 1: in main chunk [C]:?
function assert_is_number ( v, msg ) <br/>
if type ( v ) == "number" then <br/>
return v<br/>
end <br/>
error ( <br/>
( msg or "assertion failed" ) <br/>
.. ": expected `number', got `" <br/>
.. type ( v ) .. "'" ,<br/>
3 <br/>
) <br/>
end <br/>
<br/>
function assert_is_string ( v, msg ) <br/>
if type ( v ) == "string" then <br/>
return v<br/>
end <br/>
error ( <br/>
( msg or "assertion failed" ) <br/>
.. ": expected `string', got `" <br/>
.. type ( v ) .. "'" ,<br/>
3 <br/>
) <br/>
end <br/>
<br/>
function repeater ( n, message ) <br/>
assert_is_number ( n, "bad n type" ) <br/>
assert_is_string ( message, "bad message type" ) <br/>
<br/>
for i = 1 , n do <br/>
print ( message ) <br/>
end <br/>
end
foo = { } <br/>
function foo:setn ( n ) <br/>
assert_is_table ( self, "bad self type" ) <br/>
assert_is_number ( n, "bad n type" ) <br/>
self.n_ = n<br/>
end
> foo.setn (3) stdin: 1: bad self type: expected `table ', got` number' stack traceback: [C]: in function 'error' stdin: 5: in function 'assert_is_table' stdin: 2: in function 'setn' stdin: 1: in main chunk [C]:?
function assert_is_self ( v, msg ) <br/>
if type ( v ) == "table" then <br/>
return v<br/>
end <br/>
error ( <br/>
( msg or "assertion failed" ) <br/>
.. ": bad self (got `" .. type ( v ) .. "'); use `:'" ,<br/>
3 <br/>
) <br/>
end <br/>
<br/>
foo = { } <br/>
function foo:setn ( n ) <br/>
assert_is_self ( self ) <br/>
assert_is_number ( n, "bad n type" ) <br/>
self.n_ = n<br/>
end
> foo.setn (3) stdin: 1: assertion failed: bad self (got `number '); use `: ' stack traceback: [C]: in function 'error' stdin: 5: in function 'assert_is_self' stdin: 2: in function 'setn' stdin: 1: in main chunk [C]:?
function repeater ( n, message ) <br/>
arguments ( <br/>
"number" , n,<br/>
"string" , message<br/>
) <br/>
<br/>
for i = 1 , n do <br/>
print ( message ) <br/>
end <br/>
end
void repeater ( n , message ) <br/>
int n ; <br/>
char * message ; <br/>
{ <br/>
/* ... */ <br/>
}
function arguments ( ... ) <br/>
local nargs = select ( "#" , ... ) <br/>
for i = 1 , nargs, 2 do <br/>
local expected_type, value = select ( i, ... ) <br/>
if type ( value ) ~ = expected_type then <br/>
error ( <br/>
"bad argument #" .. ( ( i + 1 ) / 2 ) <br/>
.. " type: expected `" .. expected_type<br/>
.. "', got `" .. type ( value ) .. "'" ,<br/>
3 <br/>
) <br/>
end <br/>
end <br/>
end
> repeater ("bar", 3) stdin: 1: bad argument # 1 type: expected `number ', got` string' stack traceback: [C]: in function 'error' stdin: 6: in function 'arguments' stdin: 2: in function 'repeater' stdin: 1: in main chunk [C]:? > repeater (3) stdin: 1: bad argument # 2 type: expected `string ', got` nil' stack traceback: [C]: in function 'error' stdin: 6: in function 'arguments' stdin: 2: in function 'repeater' stdin: 1: in main chunk [C]:?
function method_arguments ( self, ... ) <br/>
if type ( self ) ~ = "table" then <br/>
error ( <br/>
"bad self (got `" .. type ( v ) .. "'); use `:'" ,<br/>
3 <br/>
) <br/>
end <br/>
arguments ( ... ) <br/>
end <br/>
<br/>
foo = { } <br/>
function foo:setn ( n ) <br/>
method_arguments ( <br/>
self,<br/>
"number" , n<br/>
) <br/>
self.n_ = n<br/>
end
random = <br/>
docstring [ [ Compute random number. ] ] ..<br/>
typecheck ( "number" , '->' , "number" ) ..<br/>
function ( n ) <br/>
return math.random ( n ) <br/>
end
- { extension "types" } <br/>
<br/>
function sum ( x :: list ( number ) ) :: number<br/>
local acc :: number = 0 <br/>
for i = 1 , #x do acc = acc+x [ i ] end <br/>
return acc<br/>
end
Source: https://habr.com/ru/post/76001/
All Articles