Где находится документация для Array()?

Просматривая исходный код правила, я заметил, что они вызывали Container(: и), что я редко вижу. Фактически, единственное другое место, которое я видел, это драгоценный камень.

Быстрый просмотр показал, что контейнер подклассов Array, и быстрый переход в Pry показало, что Array(:anything) #=> [:anything],

Еще один быстрый взгляд на документацию по ruby ​​для Array не проливает много света на этот вопрос.

Какой метод вызывается Array() Где это задокументировано, как можно определить метод, подобный этому, и считается ли он "плохой формой" в ruby?

3 ответа

Решение

На ваш первый вопрос ответ состоит в том, что он создает массив своих параметров.

Во-вторых, я понятия не имею, но это достаточно просто.

В-третьих, вот оно: в Ruby определение глобального метода с тем же именем, что и у класса, считается хорошей формой, только когда используется для создания или преобразования из объекта этого типа более фундаментального типа. Вы не должны определять этот метод, если вы не создаете какой-то тип низкого типа. Вы можете определить это для некоторого класса, как BigInt128 но ты не должен ObscureOrSpecializedType678, Существует также дизайн для этих методов.

Если переданные вами данные возвращаемого типа, верните их. Если данные относятся к напрямую связанному типу, выполните очевидные преобразования (Fixnum в BigInt128). Если переданные данные могут быть преобразованы и связаныString в Fixnum) преобразовать его (это преобразование обычно только для String). Если данные не могут быть преобразованы, выведите исключение. Вы никогда не должны возвращать "магическое значение".

Другое использование этого метода - создание полунитерального синтаксиса для не-литеральных типов. Лучшие примеры этого Rational() а также Complex(), Эти функции, в дополнение к выполнению преобразований, позволяют более естественно создавать рационы и комплексные числа (Rational(1, 2) против Rational.new(1, 2)). Если существует определенный список аргументов, который проще буквального представления типа, вы должны определить Classname() метод.

По большей части эти методы являются только частью основного языка, и если вы не создаете такой класс, как BigInt128 или же FancyString или же NaturalNumberВы не должны определять эти методы.


Из того, что я знаю, определены следующие:

  • Array(*args) - возвращает аргументы в виде массива
  • Complex(real, complex) - Создать комплексное число с заданными действительными и сложными частями
  • Float(arg) - возврат arg конвертируется в число с плавающей точкой (тоже принимает строки)
  • Integer(arg) -- Такой же как Float(), но преобразуется в целое число (числа с плавающей точкой усекаются)
  • Rational(numerator, denominator=1) - Создает рациональный номер с заданными частями
  • String(arg) - Преобразует аргумент в строку, вызывая to_s

Кроме того, некоторые классы определяют [] как метод класса, который используется для более сложной инициализации из базовых типов данных (только обычная инициализация, а не преобразование), таких как Hash[],

Я не знаю, так ли это на самом деле, но провел несколько тестов с iurb, и я думаю, что это всего лишь вспомогательная функция для создания нового массива.

Учитывая, что у меня есть этот класс

class MyClass
  def initialize(arg)
    puts "Initialized with #{arg.to_s}"
  end
end

тогда я могу определить вспомогательную функцию, такую ​​как

def MyClass(arg)
  MyClass.new(arg)
end

и вот, пожалуйста

irb(main):009:0> MyClass(1)
Initialized with 1
=> #<MyClass:0x4770e10>

Ээээ, раз ты в Прай, почему бы не попросить Прай показать тебе документацию?!?!

[25] (pry) main: 0> show-doc Array

From: object.c in Ruby Core (C Method):
Number of lines: 4
Owner: Kernel
Visibility: private
Signature: Array(arg1)

Returns arg as an Array. First tries to call
arg.to_ary, then arg.to_a.

   Array(1..5)   #=> [1, 2, 3, 4, 5]
[26] (pry) main: 0> show-method Array

From: object.c in Ruby Core (C Method):
Number of lines: 5
Owner: Kernel
Visibility: private

static VALUE
rb_f_array(VALUE obj, VALUE arg)
{
    return rb_Array(arg);
}
[27] (pry) main: 0> 
Другие вопросы по тегам