|
|||
def.
Los nombres de los Métodos deben empezar con un minúscula
.[ No obtendrá un error inmediato si utiliza un palabra que
inicia
en mayúscula, pero cuando Ruby le vea llamando este método, en
principio supondrá
que es una constante, no una invocación de método, y por lo tanto
resultará en que
que lo analizará incorrectamente.] Métodos que actuán como
preguntas
usualmente terminan en ``?'', por ejemplo
instance_of?. Los Métodos que son ``peligrosos,'' o modifican
al receptor,
su nombre puede terminar con un ``!''. Por ejemplo,
String provee tanto chop como chop!. El
primero
regresa una cadena modificada; el segundo modifica al receptor.
``?'' y ``!''
son los únicos caracteres extraños que se permiten como sufijos en los
nombre de los métodos.
Ahora que hemos especificado un nombre para nuestro nuevo método,
podriamos necesitar
declarar algunos parámetros.
Estos son simplemente una lisa de nombres de variables locales en un
parentésis.
Algunas muestras de declaraciones de métodos son
def myNewMethod(arg1, arg2, arg3) # 3 arguments # Code for the method would go here end def myOtherNewMethod # No arguments # Code for the method would go here end |
def coolDude(arg1="Miles", arg2="Coltrane", arg3="Roach")
|
||
"#{arg1}, #{arg2}, #{arg3}."
|
||
end
|
||
|
||
coolDude
|
» |
"Miles, Coltrane, Roach."
|
coolDude("Bart")
|
» |
"Bart, Coltrane, Roach."
|
coolDude("Bart", "Elwood")
|
» |
"Bart, Elwood, Roach."
|
coolDude("Bart", "Elwood", "Linus")
|
» |
"Bart, Elwood, Linus."
|
return explícita.
def varargs(arg1, *rest)
|
||
"Got #{arg1} and #{rest.join(', ')}"
|
||
end
|
||
|
||
varargs("one")
|
» |
"Got one and "
|
varargs("one", "two")
|
» |
"Got one and two"
|
varargs "one", "two", "three"
|
» |
"Got one and two, three"
|
Arreglo, Tabla,
el cual es entonces asignado a ese parámetro.
yield.
def takeBlock(p1) if block_given? yield(p1) else p1 end end |
takeBlock("no block")
|
» |
"no block"
|
takeBlock("no block") { |s| s.sub(/no /, '') }
|
» |
"block"
|
Proc , y ese objeto es asignado al parámetro.
class TaxCalculator
|
||
def initialize(name, &block)
|
||
@name, @block = name, block
|
||
end
|
||
def getTax(amount)
|
||
"#@name on #{amount} = #{ @block.call(amount) }"
|
||
end
|
||
end
|
||
|
||
tc = TaxCalculator.new("Sales tax") { |amt| amt * 0.075 }
|
||
|
||
tc.getTax(100)
|
» |
"Sales tax on 100 = 7.5"
|
tc.getTax(250)
|
» |
"Sales tax on 250 = 18.75"
|
connection.downloadMP3("jitterbug") { |p| showProgress(p) }
|
connection es el receptor,
downloadMP3 es el nombre del método, "jitterbug"
es
el paraámetro, y lo que esta entre las llaves o corchetes es el bloque
asociado.
Para métodos de clases o módulos, el receptor será el nombre de la
clase o módulo.
File.size("testfile")
Math.sin(Math::PI/4)
|
self, el objeto actual.
self.id
|
» |
537794160
|
id
|
» |
537794160
|
self.type
|
» |
Object
|
type
|
» |
Object
|
a = obj.hash # Same as
a = obj.hash() # this.
obj.someMethod "Arg1", arg2, arg3 # Same thing as
obj.someMethod("Arg1", arg2, arg3) # with parentheses.
|
def five(a, b, c, d, e)
|
||
"I was passed #{a} #{b} #{c} #{d} #{e}"
|
||
end
|
||
|
||
five(1, 2, 3, 4, 5 )
|
» |
"I was passed 1 2 3 4 5"
|
five(1, 2, 3, *['a', 'b'])
|
» |
"I was passed 1 2 3 a b"
|
five(*(10..14).to_a)
|
» |
"I was passed 10 11 12 13 14"
|
listBones("aardvark") do |aBone|
# ...
end
|
if o while .
En ocasiones, le gustaría obtener más flexibilidad. Por ejemplo,
Nosotros podriamos estar enseñando habilidades matemáticas.
[Por supuesto, en primer lugar Andy y Dave deberían de
aprender habilidades matemáticas .
Conrad Schneiker nos recuerda que hay tres tipos de personas: Los que
pueden contar
y los que no.] El Estudiante podría preguntar por una tabla
de
multiplicar de n-o una tabla de n-veces. Si el
estudiante
pregunta por una tabla de 2-veces, nosotros desplegariamos 2, 4, 6,
8, y sucesivamente
. (Este código no verifica los datos enterados.)
print "(t)imes or (p)lus: "
times = gets
print "number: "
number = gets.to_i
if times =~ /^t/
puts((1..10).collect { |n| n*number }.join(", "))
else
puts((1..10).collect { |n| n+number }.join(", "))
end
|
(t)imes or (p)lus: t number: 2 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 |
if . Sería agradable si pudieramos armar un
bloque que realizara
el cálculo.
print "(t)imes or (p)lus: "
times = gets
print "number: "
number = gets.to_i
if times =~ /^t/
calc = proc { |n| n*number }
else
calc = proc { |n| n+number }
end
puts((1..10).collect(&calc).join(", "))
|
(t)imes or (p)lus: t number: 2 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 |
Proc . Lo remueve de
la lista de parámetros y convierte dicho objeto
Proc en un bloque,
y lo asocia con el método.
Esta técnica tambien puede ser usada para agregar facilidades
sintácticas al uso de bloques. Por ejemplo, Usted algunas veces
querrá tomar un interactor y guardar cada valor que produce en un
arreglo. Reutilizaremos nuestro generador de números Fibonacci
de la página 40.
a = []
|
||
fibUpTo(20) { |val| a << val }
|
» |
nil
|
a.inspect
|
» |
"[1, 1, 2, 3, 5, 8, 13]"
|
into, el
cual
regresa el bloque que llena el arreglo. (Note que al mismo tiempo que
el
bloque regresa es realmente un terminador o finalizador---este hace
referencia
al parámetro anArray aún depues de que el método
into ha regresado o
finalizado de ejecutar.)
def into(anArray)
|
||
return proc { |val| anArray << val }
|
||
end
|
||
|
||
fibUpTo 20, &into(a = [])
|
||
a.inspect
|
» |
"[1, 1, 2, 3, 5, 8, 13]"
|
SongList.
class SongList
def createSearch(name, params)
# ...
end
end
aList.createSearch("short jazz songs", {
'genre' => "jazz",
'durationLessThan' => 270
} )
|
=> valor en una
lista de argumentos,
siempre que estos sucedan a los argumentos normales y precedan
cualquier argumento de
arreglo o bloque. Todas estas parejas serán recogidas en un solo
diccionario y pasadas
como un solo argumento al método. No se requiern llaves o corchetes.
aList.createSearch("short jazz songs",
'genre' => "jazz",
'durationLessThan' => 270
)
|