小编saw*_*awa的帖子

类,模块,它们的本征类和方法查找

让我们打开课程Module并为其添加一个方法:

class Module  
  def foo  
    puts "phew"  
  end  
end
Run Code Online (Sandbox Code Playgroud)

我可以通过这样做来调用这个方法,

Class.foo
Run Code Online (Sandbox Code Playgroud)

这是可以理解的,因为ClassClass超类的类Module.所以它可以调用中定义的实例方法Module.

类和模块之间的关系

现在,bar下面的方法是在Module'eigenclass 上定义的:

class Module  
   def self.bar  
     puts "bar"  
   end  
end
Run Code Online (Sandbox Code Playgroud)

但现在

Class.bar 
Run Code Online (Sandbox Code Playgroud)

也有效.

有人可以解释一下如何在特征类Class中访问方法Module吗?


我想我现在明白了.方法查找不像我之前解释的那样工作.当我这样做的时候Class.foo,这个方法是在特征Class类中进行搜索,然后是超类,它是本Module征类的特征类,直到它的特征类BasicObject,此时它会转向自身(就像蛇吃它自己的尾巴)来寻找方法Class(就像'eigenclass Class的超类BasicObject一样)然后到它的超类Module,它找到了方法.

类似地,当我这样做时Class.bar,方法在Class's eigenclass中搜索,然后在Module它找到它的本征类中搜索.

当我做

class Class   
  def check  
    puts "class instance method"  
  end
end …
Run Code Online (Sandbox Code Playgroud)

ruby lookup module class eigenclass

5
推荐指数
1
解决办法
618
查看次数

UML图生成器

Ruby有一个很好的UML图生成器吗?我看到RailRoadyRailRoad,但他们需要Rails.

ruby gem uml

5
推荐指数
0
解决办法
247
查看次数

如果一个空字符串是真的有什么好处?

在Ruby中,""关于条件,空字符串是真的.我看到很多人都在为这个事实而苦苦挣扎.Ruby on Rails blank?是尝试克服这个问题的一种尝试.另一方面,当这种说明变得方便时,并不是立即显而易见的.是否有任何用例,这个事实变得方便,否则会出现理论上的问题?

ruby string boolean

5
推荐指数
2
解决办法
6331
查看次数

类变量的范围

@@foo在两个类中设置一个类变量,B并且C它们都不是另一个类的子类,但它们都包含一个公共模块A,似乎@@foo分别为B和创建C,它们A无法访问:

module A; end
class B; include A; @@foo = 1 end
class C; include A; @@foo = 2 end

module A; p @@foo end # => NameError: uninitialized class variable @@foo in A
class B; p @@foo end  # => 1
class C; p @@foo end  # => 2
Run Code Online (Sandbox Code Playgroud)

但是,当@@foo被分配了A,这可以作为一个祖先既BC,则@@fooBC接入成为 …

ruby class-variables

5
推荐指数
1
解决办法
172
查看次数

返回可以是多个的所有最大值或最小值

Enumerable#max_by当接收器中有多个最大/最小元素时,Enumerable#min_by返回一个相关元素(可能是第一个).例如,以下内容:

[1, 2, 3, 5].max_by{|e| e % 3}
Run Code Online (Sandbox Code Playgroud)

仅返回2(或仅返回5).

相反,我想返回所有最大/最小元素和数组.在上面的例子中,它将是[2, 5](或[5, 2]).得到这个的最好方法是什么?

ruby max min maxby

5
推荐指数
1
解决办法
1550
查看次数

学习Ruby艰难之路第9章三重引号

Zed Shaw's Learn Ruby the Hard Way第9章使用三重双引号:

puts """
There's something going on here.
With the three double-quotes.
We'll be able to type as much as we like.
Even 4 lines if we want, or 5, or 6.
"""
Run Code Online (Sandbox Code Playgroud)

我试着用单双引号写同样的东西,它似乎工作正常.我不明白三重和单双引号之间的区别.我错过了什么吗?

ruby string-literals

5
推荐指数
2
解决办法
1413
查看次数

Ruby:如何将条件插入到字符串连接中

在字符串连接中,是否可以直接在语句中包含条件?

在下面的示例中,我希望"my dear"仅在dear列表不为空时才连接.

dear = ""

string = "hello" + " my dear" unless dear.empty? + ", good morning!" 
Run Code Online (Sandbox Code Playgroud)

但结果是错误:未定义的方法'+'表示true

我知道替代方法是在此语句之前定义一个额外的变量,但我想避免这种情况.

ruby

5
推荐指数
2
解决办法
5970
查看次数

在“nil”上双击

我的理解是,非数组对象上的单个 splat 调用to_a然后将元素分离。由于nil.to_a被定义为[],因此会发生以下转换:

[:foo, *nil, :bar]
# => [:foo, *nil.to_a, :bar]
# => [:foo, *[], :bar]
# => [:foo, :bar]
Run Code Online (Sandbox Code Playgroud)

通过类比,我认为非哈希对象上的 double splat 调用to_h然后将键值对分离。由于nil.to_h被定义为{},我预计会发生以下转换:

{"foo" => 1, **nil, "bar" => 2}
# => {"foo" => 1, **nil.to_h, "bar" => 2}
# => {"foo" => 1, **{}, "bar" => 2}
# => {"foo" => 1, "bar" => 2}
Run Code Online (Sandbox Code Playgroud)

但实际上,它会引发一个错误:no implicit conversion of nil into Hash。为什么它会这样?

编辑我不是在问设计背后的原因。我想问我关于双打的想法哪里错了。

ruby hash literals splat double-splat

5
推荐指数
1
解决办法
542
查看次数

定义方法参数的条件

我有一个方法只采用一个参数:

def my_method(number)

end
Run Code Online (Sandbox Code Playgroud)

如果使用number < 2?调用方法,如何引发错误?通常,我如何定义方法参数的条件?

例如,我想在调用时出错:

my_method(1)
Run Code Online (Sandbox Code Playgroud)

ruby methods

5
推荐指数
1
解决办法
122
查看次数

检查方法是否是rspec中另一个方法的别名

Article#to_archive是别名Article#archived!:

class Article
  alias to_archive archived!
end
Run Code Online (Sandbox Code Playgroud)

我需要确保这一点,所以我写了这个测试:

describe '#to_archive' do
  it 'is an alias to #archived!' do
    expect(subject.method(:to_archive)).to eq(subject.method(:archived!))
  end
end
Run Code Online (Sandbox Code Playgroud)

但是,我收到一个错误

Failure/Error: expect(subject.method(:to_archive)).to eq(subject.method(:archived!))

   expected: #<Method: Article(#<Module:0x00000005a7c240>)#archived!>
        got: #<Method: Article(#<Module:0x00000005a7c240>)#to_archive(archived!)>
Run Code Online (Sandbox Code Playgroud)

它曾用于红宝石<2.3 IIRC.我试过了alias_method,但没有用.

ruby methods

5
推荐指数
1
解决办法
282
查看次数