草庐IT

ruby 心印 : explicit scoping on a class definition part 2

coder 2025-04-30 原文

我想澄清这个原始 post 的一些事情.答案建议 Ruby 按以下顺序搜索常量定义:

  1. 封闭范围
  2. 任何外部范围(重复直到达到顶层)
  3. 包含的模块
  4. 父类(super class)
  5. 对象
  6. 内核

所以澄清一下,在第 (1-6) 步是为 legs_in_oyster 找到的常量 LEGS 的值?它来自父类(super class) Animal 吗?类 MyAnimals 的范围是否因为不被视为封闭范围而被忽略?这是由于明确的 MyAnimals::Oyster 类定义吗?

谢谢!只是想了解。这是代码:

 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 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 heirarachy?

 # ------------------------------------------------------------------

 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 heirarachy?  Why is it
 # different than the previous answer?
 end

最佳答案

我只是在思考来自同一个公案的同一个问题。我不是范围界定方面的专家,但以下简单的解释对我来说很有意义,也许它也会对你有所帮助。

当您定义 MyAnimals::Oyster 时,您仍在全局范围内,因此 ruby​​ 不知道 MyAnimals< 中设置为="" 2="" 的="">LEGS 因为你实际上从未在 MyAnimals 的范围内(有点违反直觉)。

但是,如果您以这种方式定义 Oyster,情况就会有所不同:

class MyAnimals
  class Oyster < Animal
    def legs_in_oyster
      LEGS # => 2
    end
  end
end

不同的是,在上面的代码中,当你定义Oyster时,你已经进入了MyAnimals的范围,所以ruby知道LEGS 指的是 MyAnimals::LEGS (2) 而不是 Animal::LEGS (4)。

仅供引用,我从以下 URL(在您链接到的问题中引用)获得了这个见解:

关于 ruby 心印 : explicit scoping on a class definition part 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5464811/

有关ruby 心印 : explicit scoping on a class definition part 2的更多相关文章

  1. day1-数组part01| 704. 二分查找、27. 移除元素 - 2

    数组理论基础数组是存放在连续内存空间上的相同类型数据的集合。数组下标从0开始数组内存空间的地址是连续的c++中vector和array的区别1、vector是顺序容器,其利用连续的内存空间来存储元素,但是其内存空间大小是能够改变的。2、array是顺序容器,其也是利用连续的内存空间来存储元素,但它的内存空间是固定大小的,申请之后就无法改变。3、vector的底层是array实现的二维数组二维数组在内存的空间地址是连续的704|二分查找思路1、把整个数组一分为二;2、判断目标值在左区间还是右区间,若在左区间,则修改右区间指针的位置;若在右区间,则修改新区间的左区间位置3、重复上述过程,直到lef

  2. ruby 心印 : Where are the quotes in this return value? - 2

    我正在研究以下RubyKoan:classDog7attr_reader:namedefinitialize(initial_name)@name=initial_nameenddefget_selfselfenddefto_s__enddefinspect""endenddeftest_inside_a_method_self_refers_to_the_containing_objectfido=Dog7.new("Fido")fidos_self=fido.get_selfassert_equal"",fidos_selfenddeftest_to_s_provides_a_st

  3. ruby 心印 : explicit scoping on a class definition part 2 - 2

    我想澄清这个原始post的一些事情.答案建议Ruby按以下顺序搜索常量定义:封闭范围任何外部范围(重复直到达到顶层)包含的模块父类(superclass)对象内核所以澄清一下,在第(1-6)步是为legs_in_oyster找到的常量LEGS的值?它来自父类(superclass)Animal吗?类MyAnimals的范围是否因为不被视为封闭范围而被忽略?这是由于明确的MyAnimals::Oyster类定义吗?谢谢!只是想了解。这是代码:classAnimalLEGS=4deflegs_in_animalLEGSendclassNestedAnimaldeflegs_in_neste

  4. ruby 心印 : Why convert list of symbols to strings - 2

    我指的是RubyKoans中about_symbols.rb中的这个测试https://github.com/edgecase/ruby_koans/blob/master/src/about_symbols.rb#L26deftest_method_names_become_symbolssymbols_as_strings=Symbol.all_symbols.map{|x|x.to_s}assert_equaltrue,symbols_as_strings.include?("test_method_names_become_symbols")end#THINKABOUTIT:#

  5. javascript - 如何测试一个字符串是否是另一个字符串的最后一个 “part”? - 2

    varlongString="thisstringislongbutwhy"varshortString="butwhy"我如何测试shortString是否不仅包含在longString中而且实际上是字符串的最后一部分。我使用indexOf==0来测试字符串的开头,但不确定如何获取它的结尾 最佳答案 你不需要正则表达式,如果它是javascript你可以这样做:longString.endsWith(shortString) 关于javascript-如何测试一个字符串是否是另一个字符

  6. javascript - 如何检测鼠标是否在:before or over the :after part of an element上方 - 2

    我有这个CSS来定义放置区域,用户可以在现有部分之前或之后放置一个部分。.section:before,.section:after{content:"[inserthere]";height:64px;line-height:56px;width:100%;display:block;border:3pxdashed#aaa;}这里使用JavaScript+JQuery是放置监听器,它检测当前鼠标下的元素:elem.on('drop',function(e){e.preventDefault();varcontainer=$(elem[0].elementFromPoint(e.cl

  7. javascript - Crockford 的 hanoi 函数(来自 "The Good Parts") - 2

    这个问题在这里已经有了答案:HowdoesrecursivealgorithmworkforTowersofHanoi?(2个答案)关闭8年前。目前,我正在阅读道格拉斯·克罗克福德(DouglasCrockford)的书,汉诺塔的功能让我有点头疼。即使在控制台上记录了一些东西,我也无法真正理解发生了什么。这是我添加的功能:varhanoi=function(disc,src,aux,dst){console.log(disc);console.log(src,dst);if(disc>0){hanoi(disc-1,src,dst,aux);console.log('Movedisc'

  8. javascript - 观察一个JS事件,当你只知道事件名称的PART? - 2

    我继承了一些触发一堆事件的JS(我无法更改):jQuery(document).trigger('section:'+section);//where"section"changesdynamically我想观察所有这些事件,解析出section的值,并根据它的内容做一些不同的事情。如果它没有改变,我可以这样做:jQuery(document).on('section:top',doStuff);但是,如果我只知道事件名称的第一部分,我该如何观察该事件呢? 最佳答案 不幸的是,您不能以$().on('section:*')的样式监听

  9. 正则表达式 : Match text NOT part of a HTML tag - 2

    我真的想要一个在node.js中可执行的正则表达式(所以没有jQueryDOM处理等,因为标签可以有不同的嵌套)匹配所有不是HTML标签或部分的文本它分成不同的组。例如我想匹配"5","ELT.","SPR","","plo","Unterricht",""," "和"plo"来自那个字符串:5ELT.SPR pioUnterricht  pio我可以保证标签中不会有“>”。我找到的解决方案是(?)[^>,但这在node.js中不起作用(可能是因为前瞻?它说“无效组”)有什么建议吗?(是的,我真的认为Regex是正确的方式,因为html可能以其他方

  10. 【全栈计划 —— 单片机】——Part_04 IO口输入功能的使用 - 2

    文章目录前言独立按键实验💒项目代码及效果🌟刨根问底环节🌻浅识按键代码设计矩阵按键实验💒项目代码及效果🌟刨根问底环节🌻浅识矩阵按键代码设计浅读代码总结前言杨枝的单片机专栏,多图多阐述,争取让大家在学习单片机的路上减少些许的痛苦虽说是14天,但是我自己快更了半个月了,也才更了一半,我看了一下后面的知识,可以拎出来说的不是特别多啦,我已经在买STM32的板子啦,咱们重心还是得放在32~14天了,是对于各位看这个篇文章的小伙伴来说嗷,一天看一篇,轻松上手,不再害怕单片机。因为我自己现在呢,抬头是算法题海,低头是作业项目,很多时候只是写得完草稿,没有及时发出来,抱歉哈,原谅我🌹🌹🌹独立按键实验💒项目代码

随机推荐