Что делает этот фрагмент ruby? - PullRequest
0 голосов
/ 01 марта 2019

Как рубиновый новичок, я пытаюсь понять фрагмент кода в нашей базовой линии.Может ли кто-нибудь сделать это для меня?Фрагмент приведен ниже

%w{word1 word2}.each { |att| define_method(att.to_sym) { return nil }}

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

%w{word1 word2} = создание массива, который выглядит следующим образом ['word1', 'word2']
.each = итерация каждого значения в массиве
{} = это блок кода, каждое значение в массиве будет проходить через этот блок
|attr| = параметр блока.каждое значение в массиве будет размещено здесь
define_method = определить метод из аргумента
(att.to_sym) = имя нового метода.это будет word1, а затем word2
{ return nil } = тело нового метода

Итак, вы определяете два новых метода,Один метод называется word1, а другой - word2.Каждый из этих методов будет иметь тело return nil.Они будут выглядеть так:

def word1
  return nil
end

def word2
  return nil
end
0 голосов
/ 02 марта 2019

Как и jdv сказал в комментариях , для учебных пособий вам может быть лучше на других сайтах.Вот все ссылки, необходимые для понимания предоставленного фрагмента кода:

  • Процентные строки , используемые в %w{word1 word2}

    Процентные строки

    Помимо %(...), который создает String , % может создавать другие типы объектов.Как и в случае со строками, заглавная буква допускает интерполяцию и экранированные символы, в то время как строчная буква запрещает их.

    Это типы процентных строк в ruby:

    Для двух форм массива строки процентов, если вы хотите включить пробел водна из записей массива, вы должны экранировать ее символом «\»:

    %w[one one-hundred\ one]
    #=> ["one", "one-hundred one"]
    

    Если вы используете «(», «[», «{», «<», вы должны закрыть его с помощью «) »,«] »,«} »,«> »Соответственно.Вы можете использовать большинство других не алфавитно-цифровых символов для разделителей строк в процентах, таких как «%», «|», «^» и т. Д.

  • Array#each

    каждый {| item |block} → ary

    each → Enumerator

    Вызывает данный блок один раз для каждого элемента в self, передавая этот элемент в качестве параметра.Возвращает сам массив.

    Если блок не задан, возвращается Перечислитель .

    a = [ "a", "b", "c" ]
    a.each {|x| print x, " -- " }
    

    производит:

    a -- b -- c --
    
  • Module#define_method

    define_method (символ, метод) → символ

    define_method (символ) {блок} → символ

    Определяет метод экземпляра в получателе.Параметр method может быть объектом Proc, Method или UnboundMethod.Если указан блок, он используется как тело метода.Этот блок оценивается с использованием instance_eval.

    class A
      def fred
        puts "In Fred"
      end
      def create_method(name, &block)
        self.class.define_method(name, &block)
      end
      define_method(:wilma) { puts "Charge it!" }
    end
    class B < A
      define_method(:barney, instance_method(:fred))
    end
    a = B.new
    a.barney
    a.wilma
    a.create_method(:betty) { p self }
    a.betty
    

    :

    In Fred
    Charge it!
    #<B:0x401b39e8>
    
  • String#to_sym

    to_sym → symbol

    Возвращает Symbol, соответствующий str , создавая символ, если он ранее не существовал.См. Symbol#id2name.

    "Koala".intern         #=> :Koala
    s = 'cat'.to_sym       #=> :cat
    s == :cat              #=> true
    s = '@cat'.to_sym      #=> :@cat
    s == :@cat             #=> true
    

    Это также может быть использовано для создания символов, которые не могут быть представлены с использованием записи :xxx.

    'cat and dog'.to_sym   #=> :"cat and dog"
    
0 голосов
/ 01 марта 2019

В контексте, где будет выполняться эта строка, будут определены два метода

def word1
  return nil
end

def word2
  return nil
end

Например

class MyClass
  %w{word1 word2}.each { |att| define_method(att.to_sym) { return nil }}
end

После загрузки файла my_class.rb вы сможетепотреблять сгенерированные методы

test = MyClass.new
test.word1
# or
test.word2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...