Я просто нашел это недавно. Используйте OuterClassName.this
.
class Outer {
void foo() {
new Thread() {
public void run() {
Outer.this.bar();
}
}.start();
}
void bar() {
System.out.println("BAR!");
}
}
Обновленный , Если Вы просто хотите сам объект (вместо того, чтобы вызвать участников), тогда Outer.this
, способ пойти.
class MyEnum
attr_accessor :value
def initialize(value)
@value = value
end
VALUE1 = new("Value 1")
VALUE2 = new("Value 2")
class << self
private :new
end
end
MyEnum::VALUE2 # Enum with value "Value 2"
MyEnum.new # Error
Более сложное решение, которое позволяет вам определять произвольные «классы перечисления», а также дает вам ordinal ()
:
def enum(*values, &class_body)
Class.new( Class.new(&class_body) ) do
attr_reader :ordinal
def initialize(ordinal, *args, &blk)
super(*args, &blk)
@ordinal = ordinal
end
values.each_with_index do |(name, *parameters), i|
const_set(name, new(i, *parameters))
end
class <<self
private :new
end
end
end
# Usage:
MyEnum = enum([:VALUE1, "Value 1"], [:VALUE2, "Value 2"]) do
attr_reader :str
def initialize(str)
@str = str
end
end
MyEnum::VALUE1.str #=> "Value 1"
MyEnum::VALUE2.ordinal #=> 1
Вы всегда можете создать систему, похожую на версию Java:
module Foo
class Value
attr_reader :value
def initialize(value)
# Save a frozen, immutable copy
@value = value.dup.freeze
end
# Patch in methods to make it appear more friendly and string-like
alias_method :to_s, :value
alias_method :inspect, :value
end
# Define constants
BAR = Value.new('bar')
BAZ = Value.new('baz')
BIZ = Value.new('biz')
end
puts Foo::BAR
# => bar