Ruby и модифицирование себя для экземпляра Float - PullRequest
8 голосов
/ 09 января 2011

Я хотел бы изменить значение self экземпляра float.

У меня есть следующий метод:

class Float
  def round_by(precision)
    (self * 10 ** precision).round.to_f / 10 ** precision
  end
end

И я хотел бы добавить round_by!метод, который изменит значение собственной личности.

class Float
  def round_by!(precision)
    self = self.round_by(precision)
  end
end

Но я получил сообщение о том, что не могу изменить значение собственной личности.

Есть идеи?

Ответы [ 3 ]

11 голосов
/ 09 января 2011

Вы не можете изменить значение self.Он всегда указывает на текущий объект, вы не можете сделать так, чтобы он указывал на что-то другое.

Когда вы хотите изменить значение объекта, вы можете сделать это, вызвав другие методы мутации или установив или изменивзначения переменных экземпляра, не пытаясь переназначить self.Однако в этом случае это вам не поможет, потому что Float не имеет никаких методов мутации, а установка переменных экземпляра ничего вам не даст, потому что ни одна из операций с плавающей запятой по умолчанию не затрагивается никакими переменными экземпляра.

Итак, суть в том, что вы не можете писать мутирующие методы для чисел с плавающей запятой, по крайней мере, не так, как вы хотите.

1 голос
/ 28 марта 2011

Вы также можете создать класс и сохранить число с плавающей точкой в ​​переменной экземпляра:

class Variable

  def initialize value = nil
    @value = value
  end

  attr_accessor :value

  def method_missing *args, &blk
    @value.send(*args, &blk)
  end

  def to_s
    @value.to_s
  end

  def round_by(precision)
    (@value * 10 ** precision).round.to_f / 10 ** precision
  end

  def round_by!(precision)
    @value = round_by precision
  end
end

a = Variable.new 3.141592653

puts a           #=> 3.141592653

a.round_by! 4

puts a           #=> 3.1416

Подробнее об использовании "Переменная класса" здесь .

0 голосов
/ 09 января 2011

На самом деле это действительно хороший вопрос, и мне жаль говорить, что вы не можете - по крайней мере, с классом Float. Это неизменное. Мое предложение было бы создать свой собственный класс, реализующий Float (он же наследует все методы), как в псевдокоде

class MyFloat < Float
  static CURRENT_FLOAT

  def do_something
    CURRENT_FLOAT = (a new float with modifications)
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...