2013-11-09 2 views
1

Когда вы начинаете новый проект Ruby, по умолчанию у вас есть все стандартные функции. Если вам нужны драгоценные камни и дополнительные рубиновые файлы, вам нужно их потребовать.Как бы вы создали модуль, который не требуется, например, стандартные методы, такие как chr, ord, inject?

Я хотел бы создать функцию, которая будет загружаться по умолчанию с остальными стандартными функциями.

+2

* *Зачем**? Если это не «стандартная» функция, вы должны * потребовать ее. – meagar

+0

Я понимаю, что это по умолчанию. Наверное, мне больше любопытно, как по умолчанию могут быть вызваны все функции стандартной библиотеки. Я думал, что это возможно сделать, так или иначе, но это невозможно сделать, не требуя чего-либо. Просто в тот момент, когда стандартные функции библиотеки включены по умолчанию, мне кажется черная магия. – Singularity

+0

Это не волшебство, они просто встроены. – meagar

ответ

2

Это зависит от того, где вы хотите, чтобы эти функции были доступны. Ruby имеет функцию, иногда называемую «открытыми классами» или «патчем обезьян», которая позволяет добавлять функциональные возможности к существующим классам. Вы можете просто объявить класс с тем же именем, как и тот, который уже существует в стандартной библиотеке Ruby, и определить методы в нем так:

class Array 
    def double_values 
    map { |v| v * 2 } 
    end 
end 

Тогда вы могли бы использовать его как это:

[1,2,3].double_values # => [2,4,6] 
+0

Не будет ли это ограничиваться указанным файлом? В качестве примера того, что я хотел бы сделать, это: a_to_i.rb класса 'Массив Защиту a_to_i self.map (&: to_i) конца end' test.rb массива = [ '1', '2', '3'] p array.a_to_i Я хотел бы достичь этого, не требуя файла a_to_i.rb или добавив код в файл test.rb, а также – Singularity

+0

Если вы хотите, чтобы он был доступен другим классам, просто определите его выше на цепочке. Например, если вы хотите, чтобы он был доступен для всех перечислений, вы бы определили его в Enumerable. Выше того, что у вас есть Object, Kernel и BasicObject. 'Array.ancestors' покажет вам иерархию. –

+0

Если вам не нужен файл, как Рубин знал, что вы хотите его использовать? –

0

просто заново класс, который вы хотите добавить методы

class String 

    def some_method 
    "hi there!" 
    end 

end 
+0

Он должен будет потребовать файл с этим определением. В противном случае он не будет виден. –

Смежные вопросы