-
Notifications
You must be signed in to change notification settings - Fork 2
/
about_constants.rb
113 lines (84 loc) · 2.71 KB
/
about_constants.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
require File.expand_path(File.dirname(__FILE__) + '/neo')
C = "top level"
class AboutConstants < Neo::Koan
C = "nested"
def test_nested_constants_may_also_be_referenced_with_relative_paths
assert_equal "nested", C
end
def test_top_level_constants_are_referenced_by_double_colons
assert_equal "top level", ::C
end
def test_nested_constants_are_referenced_by_their_complete_path
assert_equal "nested", AboutConstants::C
assert_equal "nested", ::AboutConstants::C
end
# ------------------------------------------------------------------
class Animal
LEGS = 4
def legs_in_animal
LEGS
end
class NestedAnimal
def legs_in_nested_animal
LEGS
end
end
end
def test_nested_classes_inherit_constants_from_enclosing_classes
assert_equal 4, Animal::NestedAnimal.new.legs_in_nested_animal
end
# ------------------------------------------------------------------
class Reptile < Animal
def legs_in_reptile
LEGS
end
end
def test_subclasses_inherit_constants_from_parent_classes
assert_equal 4, Reptile.new.legs_in_reptile
end
# ------------------------------------------------------------------
class MyAnimals
LEGS = 2
class Bird < Animal
def legs_in_bird
LEGS
end
end
end
def test_who_wins_with_both_nested_and_inherited_constants
assert_equal 2, MyAnimals::Bird.new.legs_in_bird
end
# QUESTION: Which has precedence: The constant in the lexical scope,
# or the constant from the inheritance hierarchy?
# The lexical scope.
# ------------------------------------------------------------------
class MyAnimals::Oyster < Animal
def legs_in_oyster
LEGS
end
end
def test_who_wins_with_explicit_scoping_on_class_definition
assert_equal 4, MyAnimals::Oyster.new.legs_in_oyster
end
# QUESTION: Now which has precedence: The constant in the lexical
# scope, or the constant from the inheritance hierarchy? Why is it
# different than the previous answer?
=begin
When you define MyAnimals::Oyster you are still in the global scope,
so ruby has no knowledge of the LEGS value set to 2 in MyAnimals
because you never actually are in the scope of MyAnimals
(a little counterintuitive).
However, things would be different if you were to define Oyster this way:
class MyAnimals
class Oyster < Animal
def legs_in_oyster
LEGS # => 2
end
end
end
The difference is that in the code above, by the time you define Oyster,
you have dropped into the scope of MyAnimals,
so ruby knows that LEGS refers to MyAnimals::LEGS (2) and not Animal::LEGS (4).
https://stackoverflow.com/questions/5464811/ruby-koans-explicit-scoping-on-a-class-definition-part-2
=end
end