🤔 Para Refletir :
"Não descarte uma ideia aparentemente ruim, pode ser apenas o efeito do spoiler."
- Frank

Tem como alterar um módulo? [VXA]

Kauzz

Cidadão
Membro
Membro
Juntou-se
17 de Outubro de 2016
Postagens
140
Bravecoins
1
É só isso mesmo. Quero alterar um módulo exteriormente (Pode ser ou dar call em script, ou um script que eu tenha que fazer adicional), qual o comando uso pra isso?

module me_ajuda_[you]
hirc8qI.png


No caso, tenho que alterar algumas dessas Hashes (Inicialmente só a de ID 0, mas posteriormente todas). Elas são as posições do herói na batalha, mas conforme o inimigo ou o Background eu vou ter que deslocar eles um pouco pra cima ou pra baixo.

PS: Acho que dá pra fazer isso substituindo os valores das Hashes por variaveis (@posx, @posy|ou variaveis globais), mas tem uma forma mais direta?

Tava aqui pensando, é só dar call no module de novo sobrepondo as posições, né não? ._.
Resposta: Em partes, sim, mas me parece que o modulo só carrega uma vez, ele não atualiza. :(
 
É só incluir o modulo e acessar a constante passando a posição que quer como key

Código:
include module_name
constant[0] = new value

Fiz o processo todo no IRB:
Código:
C:\Users\Diogo>irb
irb(main):001:0> module POS
irb(main):002:1> ACTORS = {
irb(main):003:2* 0 => [140, 215],
irb(main):004:2* 1 => [110, 235]
irb(main):005:2> }
irb(main):006:1> end
=> {0=>[140, 215], 1=>[110, 235]}
irb(main):007:0> include POS
=> Object
irb(main):008:0> ACTORS
=> {0=>[140, 215], 1=>[110, 235]}
irb(main):009:0> ACTORS[0]
=> [140, 215]
irb(main):010:0> ACTORS[0] = [2,2]
=> [2, 2]
irb(main):011:0> ACTORS
=> {0=>[2, 2], 1=>[110, 235]}
irb(main):012:0>
 
HermesPasser comentou:
É só incluir o modulo e acessar a constante passando a posição que quer como key

Código:
include module_name
constant[0] = new value

Fiz o processo todo no IRB:
Código:
C:\Users\Diogo>irb
irb(main):001:0> module POS
irb(main):002:1> ACTORS = {
irb(main):003:2* 0 => [140, 215],
irb(main):004:2* 1 => [110, 235]
irb(main):005:2> }
irb(main):006:1> end
=> {0=>[140, 215], 1=>[110, 235]}
irb(main):007:0> include POS
=> Object
irb(main):008:0> ACTORS
=> {0=>[140, 215], 1=>[110, 235]}
irb(main):009:0> ACTORS[0]
=> [140, 215]
irb(main):010:0> ACTORS[0] = [2,2]
=> [2, 2]
irb(main):011:0> ACTORS
=> {0=>[2, 2], 1=>[110, 235]}
irb(main):012:0>
Eu tinha feito algo assim, mas ele me retornou um erro (Acho que identificava a variável como de uma classe nula, ou algo do tipo) Mas eu tentei pelo console mesmo, e foi de uma outra forma, vou tentar assim. :)
 
[member=879]Kauzz[/member]

Viu, na verdade tu não devia alterar esse valor aí não. Quando o nome da variável começa com maiúscula é porque ela é uma constante (então não é variável), logo, idealmente, o valor dela deve ser mantido do momento em que ela foi criada até o fim do programa.

Você pode, sim, mudar o conteúdo dela nesse caso, porque Ruby não se importa, então se a gambiarra resolve o problema pra você, sinta-se à vontade de pular essa resposta (porque na verdade o que eu vou falar é mais encheção de saco que qualquer outra coisa), mas o ideal mesmo é manter constantes, bom... constantes.

O jeito "canônico" e "bonitinho" (bem entre aspas mesmo) de se ter valores mutáveis no escopo estático (ou seja, que dá pra acessar sem criar um objeto) de um módulo é criar uma variável de classe (@@variavel) e criar métodos de acesso (getters/readers e setters/writers) que alterem ela, então:


Ruby:
module Aqui_Tua_Ajuda_Kauzz

  @@actor_positions = {
    0 => [140, 215],
    1 => [110, 235],
    # ...
  }

  def self.actor_positions
    return @@actor_positions
  end

  def self.set_actor_position(id, x, y)
    @@actor_positions[id] = [x, y]
  end

end
Note a presença do self na declaração dos métodos, isso permite que você chame as funções com NomeDoModulo.nome_do_metodo ao invés de ter que criar um objeto pra chamar elas. Os dois @ no nome da variável também são importantes, e tem o mesmo tipo de efeito.

Um alternativa, também, é isso aqui:


Código:
module Aqui_Tua_Ajuda_Kauzz_Mas_Agora_Eh_Maior
  class << self
    @actor_positions = {
      0 => [140, 215],
      1 => [110, 235],
      # ...
    }

    def actor_positions
      return @actor_positions
    end

    def set_actor_position(id, x, y)
      @actor_positions[id] = [x, y]
    end
  end
end

A diferença desse pro primeiro é que esse aí não gera problemas na hora de herdar (include/extend) do módulo por causa de variável de classe, mas tem que escrever mais e fica meio feio, então eu dou sempre preferência pro de cima.

Em ambos os casos, quando precisar ver o valor da variável você chama Aqui_Tua_Ajuda_Kauzz.actor_positions e quando quiser mudar a posição de um ator você chama Aqui_Tua_Ajuda_Kauzz.set_actor_position com os parâmetros adequados (id, x e y).

Enfim, sei que sou meio chato, mas sempre que dá a gente tenta manter as boas práticas né ^^
É só isso mesmo, até mais.
 
Voltar
Topo Inferior