Como o [member=78]Masked[/member] falou, o self. naquele exemplo é opcional. Um momento bem parecidinho em que ele não é opcional seria:
Código:
class Example
def something()
puts 'Olá mundo!'
end
def initialize
something = 5 # Variável local `something` criada
something # Quem está sendo chamado aqui? A variável local ou o método acima? -- A resposta é: a variável!
self.something # Aqui certamente é o método `something` que está sendo chamado, não a variável
end
end
** A partir daqui fiz um leve EDIT pois reli a resposta acima e vi o self. no lugar errado na minha cabeça :v a resposta está certa, mas fica ainda assim o que havia escrito para complementar **
O uso do self para declarar métodos é bem perceptível quando se tenta adquirir algum valor do objeto. Pegando de exemplo (`<algo>.object_id` retorna o ID que Ruby deu ao <algo> - note que cada ID é única e todo objeto possui um `object_id`):
Código:
class A
def a_method()
p self.object_id
end
end
A.new.a_method() # => (número "aleatório")
A.a_method() # => Erro: método indefinido `a_method`
Isso ocorre porque, na linha 7,
A.new gera um objeto do tipo A, e portanto se está chamando `a_method()` do objeto recém criado, enquanto que na linha 8 estou `A` é uma classe, e quando se faz `Classe.método` o Ruby procura por "método" dentro dos métodos estáticos daquela classe (i.e. pelos métodos definidos como "def self.método").
O que tem um comportamento diferente de:
Código:
class A
def self.a_method()
p self.object_id
end
end
A.new.a_method() # => Erro: método não definido: `a_method`
A.a_method() # => Não chega aqui por conta do erro acima, mas se chegasse, rodaria OK
Aqui o erro acontece em `A.new.a_method()` por conta de que agora `a_method` é estático, ou seja, é um método da classe A mas não um método dos objetos do tipo A, enquanto que Ruby está procurando métodos do objeto `A.new`.
Se quiser um exemplo do `draw_text`, coloque este script acima do main:
Código:
class MyBitmap < Sprite
def initialize
self.bitmap = Bitmap.new(640, 480)
@value = 0
refresh
end
def refresh
self.bitmap.clear
self.bitmap.fill_rect(self.bitmap.rect, Color.new(0, 0, 64)) # Preenche o fundo com azul escuro
# Escreve um texto centralizado
self.bitmap.draw_text(320, 240, 640, 32, "MyBitmap.value = #{@value}", 1)
# Escreve um texto nas coordenadas (4, 4)
self.bitmap.draw_text(4, 4, 128, 32, "Um texto =)")
end
def value=(value)
@value = value
refresh
end
def value
return @value
end
end
class Scene_Texts
def main
bitmap = MyBitmap.new
Graphics.transition
while $scene == self
Input.update
Graphics.update
if Input.repeat?(Input::LEFT)
bitmap.value -= 1
elsif Input.repeat?(Input::RIGHT)
bitmap.value += 1
end
bitmap.update
end
end
end
E use o comando de evento "Chamar Script" para chamar:
Não testei pois estou sem o maker, mas deve funcionar.