Ruby - Беспорядок метода массива

Я пытался сделать это в Erlang:

c(N)->c(N+1)+c(N-1).
c(0).

двойной вызов себя заставляет использование памяти повыситься O(n^2), а не O(n).

Однако интерпретатору Erlang, кажется, не удается отказать.

7
задан Andrew Grimm 27 March 2012 в 23:39
поделиться

4 ответа

Kernel.Array is what is known as a module function. Other examples of module functions include Math.sin, and Math.hypot and so on.

A module function is a method that is both a class method on the module and also a private instance method. When you invoke Array() at the top-level you are invoking it as a private instance method of the main object. When you invoke it through Kernel.Array() you are invoking it as a class method on Kernel. They are the same method.

To learn more, read up on the module_function method in rubydocs: http://www.ruby-doc.org/core/classes/Module.html#M001642

4
ответ дан 7 December 2019 в 18:44
поделиться

class Object mixed-in module Kernel, but Kernel is an instance of Object. So Kernel "module" methods - is it's instance methods.

0
ответ дан 7 December 2019 в 18:44
поделиться

They are the same thing:

a = Kernel.Array('aa')
=> ["aa"]
a.class
=> Array
a = Array('aaa')
=> ["aaa"]
a.class
=> Array

Maybe there is an alias?

-2
ответ дан 7 December 2019 в 18:44
поделиться

What's confusing you is the difference between class and instance methods.

Class methods don't have an explicit receiver, and thus no self to access other fields with. They just... are.

Generally instance methods are used to query or manipulate the attributes of a given object, whereas the class methods are "helper" or "factory" methods that provide some functionality associated with or especially useful for a certain kind of class, but not dependent on actual live instances (objects) of that class.

Not sure about Ruby, but Java has (for example) a whole class, Math that contains nothing but instance methods like sin(), max(), exp() and so forth: There is no "Math" object, these are just methods that embody mathematical algorithms. Not the best example, because in Ruby those methods are probably embedded right into the numeric classes as instance methods.

The case you mention is a bit confusing because Array's () method and Kernel's Array() method are in fact different methods that do similar things. Both are class methods.

Array() takes a list of arguments and makes and returns an array containing them.

Kernel.Array() takes a single argument of an "array-able" type, such as a sequence, and takes the values returned by this argument and builds an array from those.


UPDATE

The downvote was perhaps justified; I apologize for taking on a subject outside my area of expertise. I think I'll be deleting this answer soon.

@ Chuck: I would sincerely hope that a language/library's official documentation would offer some meaningful clues as to how it works. This is what I consulted in answering this question.

The rdoc for Kernel.Array():

Returns arg as an Array. First tries to call arg.to_ary, then arg.to_a. If both fail, creates a single element array containing arg (unless arg is nil).

for Array.():

Returns a new array populated with the given objects.

I don't know about you, but I think if the docs vary that much then either they're talking about separate methods or the documentation is a train wreck.

@ freeknight:

But everything in ruby is an object of some kind, even classes and modules. And Kernel.Array is actually a method call on an specific object - the Kernel object.

Yeah, under the covers it's similar in Java too. But the Array() method isn't doing anything with Kernel, any more than Array() is doing anything with the Array class object, so this is really only a semantic quibble. It's an instance method because you could hang it off class IPSocket if you were crazy enough, and it would still work the same way.

0
ответ дан 7 December 2019 в 18:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: