让我们打开课程Module
并为其添加一个方法:
class Module
def foo
puts "phew"
end
end
Run Code Online (Sandbox Code Playgroud)
我可以通过这样做来调用这个方法,
Class.foo
Run Code Online (Sandbox Code Playgroud)
这是可以理解的,因为Class
是Class
超类的类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中,""
关于条件,空字符串是真的.我看到很多人都在为这个事实而苦苦挣扎.Ruby on Rails blank?
是尝试克服这个问题的一种尝试.另一方面,当这种说明变得方便时,并不是立即显而易见的.是否有任何用例,这个事实变得方便,否则会出现理论上的问题?
@@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
,这可以作为一个祖先既B
和C
,则@@foo
是B
和C
接入成为 …
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]
).得到这个的最好方法是什么?
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)
我试着用单双引号写同样的东西,它似乎工作正常.我不明白三重和单双引号之间的区别.我错过了什么吗?
在字符串连接中,是否可以直接在语句中包含条件?
在下面的示例中,我希望"my dear"
仅在dear
列表不为空时才连接.
dear = ""
string = "hello" + " my dear" unless dear.empty? + ", good morning!"
Run Code Online (Sandbox Code Playgroud)
但结果是错误:未定义的方法'+'表示true
我知道替代方法是在此语句之前定义一个额外的变量,但我想避免这种情况.
我的理解是,非数组对象上的单个 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
。为什么它会这样?
编辑我不是在问设计背后的原因。我想问我关于双打的想法哪里错了。
我有一个方法只采用一个参数:
def my_method(number)
end
Run Code Online (Sandbox Code Playgroud)
如果使用number < 2
?调用方法,如何引发错误?通常,我如何定义方法参数的条件?
例如,我想在调用时出错:
my_method(1)
Run Code Online (Sandbox Code Playgroud) 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
,但没有用.