Вы когда-либо использовали “переменную экземпляра класса” в каком-либо Вашем коде Ruby?

Я не знаю ни одного интерпретатора C, написанного на JavaScript, но здесь обсуждаются доступные интерпретаторы C:

Есть ли интерпретатор для C?

[114 Возможно, вам лучше поискать виртуальную машину любого типа, которая работает поверх JavaScript, а затем посмотреть, сможете ли вы найти компилятор C, который выдает правильный машинный код для виртуальной машины. Скорее всего, это будет LLVM; если вы сможете найти виртуальную машину JavaScript, которая может запускать LLVM, то вы будете в отличной форме.

Я сделал несколько поисков в Google и нашел Emscripten, который напрямую переводит код C в JavaScript! Возможно, вы можете сделать что-то с этим:

https://github.com/kripken/emscripten/wiki

Возможно, вы можете изменить Emscripten для создания «точки последовательности «после каждой скомпилированной строки C, и затем вы можете сделать свое моделируемое окружение пошаговым от точки последовательности до точки последовательности.

Я полагаю, что Emscripten внедряет LLVM, поэтому у него могут быть виртуальные регистры; если так, то это может быть идеальным для ваших целей.

7
задан pez_dispenser 20 May 2009 в 23:38
поделиться

3 ответа

Допустим, вы хотите подсчитать количество экземпляров класса (не включая подклассы)

class A
  @count = 0
  @@count = 0
  def self.inherited(subclass)
    subclass.instance_eval { @count = 0 }
  end
  def self.num_instances
    @count
  end
  def self.num_subclass_instances
    @@count
  end
  def self.new
    @count += 1
    @@count += 1
    super
  end
end
class B < A
end
class C < B
end

A.new
B.new
A.new
B.new
B.new
C.new

A.num_instances #=> 2
A.num_subclass_instances #=> 6
B.num_instances #=> 3
B.num_subclass_instances #=> 6
C.num_instances #=> 1
C.num_subclass_instances #=> 6

Вы не можете использовать переменную класса, поскольку она используется всеми классы и их подклассы. Обратите внимание на изменения, внесенные в @@ count by B и C отражены в A , но @count не используется совместно.

В общем, однако, это может быть очень полезным для хранения любых настроек, специфичных для класса. _why использует его в Dwemthy's Array для указания начальных значений для атрибутов экземпляра, и он часто используется при выполнении метапрограммирования Ruby.

4
ответ дан 7 December 2019 в 01:25
поделиться

Переменные класса являются общими для всех экземпляров класса, включая все подклассы. Иногда эта переменная в иерархии - это именно то, что нужно, но иногда вы можете предпочесть разные переменные для каждого класса. В отличие от переменных класса, переменные экземпляра класса будут принимать разные значения для каждого объекта класса.

http://martinfowler.com/bliki/ClassInstanceVariable.html

3
ответ дан 7 December 2019 в 01:25
поделиться

Yes, actually I have. This is only slightly modified and trimmed from what I had:

class Widget
  # class instance variable pattern
  class << self; attr_accessor :color; end

  def show_color()
    "This widget is #{self.class.color}"
  end
end
class WidgetR < Widget
  @color = "Russet"
end
class WidgetC < Widget
  @color = "Cordovan"
end
class WidgetL < Widget
  @color = "Liver"
end

WidgetR.new.show_color #=> "This widget is Russet"

But I'm not sure it is really necessary in the case I used it. I could have just overridden the method. Or provided a color method. Or stored it in a class variable as a Hash. Or even kept a copy in each instance (ok, that one is kinda yech). I'm sure there are other possibilities...

There are a variety of alternatives and the syntax is awkward. Given that I'm guessing the instances where it is the most natural thing to use are probably fairly rare.

It might help you to try to reproduce this behavior with class and instance variables and see that it is difficult to achieve (although it is easy if you define methods, etc).

C.J.

3
ответ дан 7 December 2019 в 01:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: