В расширении Ruby C функции rb_ C являются исправленной версией или оригиналом?

В расширении Ruby C я хотел бы вызвать функцию «rb_eval_string». Если Ruby "eval" пропатчен обезьяной, функция C вызывает исправленную обезьяну версию или исходную версию ядра?

Изменить: исправление Monkey - это метапрограммирование, в данном случае в среде Ruby, и оно переопределяет метод модуля Kernel :: eval. Примером может быть:

module Kernel
  def self.eval( eval_string, *extra )
    puts eval_string
  end
end

Ссылка: Что на самом деле означает «Monkey Patching» в Ruby?


person B. Young    schedule 24.07.2017    source источник
comment
что вы подразумеваете под «обезьяньей ловлей» в этом контексте? оставьте хотя бы ссылку на описание этого процесса   -  person quetzalcoatl    schedule 25.07.2017


Ответы (2)


Я использую исходный код документации Ruby, чтобы проверить эти вещи.

Например, метод Kernel # eval не сопоставляется кому: rb_eval_string ...

... что является сильным намеком на то, что rb_eval_string не соответствует версии с пропатченной обезьяной.

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

Другими словами, нет, rb_eval_string не сопоставляет функции виртуальной карты объекта ядра (которые обновляются во время исправления обезьяны).

Чтобы вызвать версию с исправлением обезьяны, вам нужно будет вызвать rb_funcall2 с объектом Kernel.

person Myst    schedule 25.07.2017
comment
Спасибо, что не только ответили на вопрос, но и рассказали, как ответить на вопрос по ссылкам на исходный код. - person B. Young; 25.07.2017
comment
@ B.Young, я рад помочь ???????? Я создал гем йода, поэтому я знаю, что трудно получить информацию о создании расширений C. Пожалуйста, не стесняйтесь принимать и голосовать за любые ответы, которые вам помогут. Вы всегда должны иметь возможность делать это по своим собственным вопросам (хотя может потребоваться репутация, прежде чем вы сможете сделать это с помощью вопросов и ответов других людей). Обычно мы используем голоса вместо благодарственных комментариев, чтобы комментарии оставались информативными. ☺️???????? - person Myst; 26.07.2017

В расширении Ruby C я хотел бы вызвать функцию «rb_eval_string». Если Ruby "eval" пропатчен обезьяной, функция C вызывает исправленную обезьяну версию или исходную версию ядра?

Ни один. Он вызывает функцию C. Он не вызывает ни один из методов Ruby, потому что C не знает о методах Ruby.

C не знает о патчах обезьян. В языке C не существует такой вещи, как «исправление обезьяны». Если вы вызываете функцию C, вы вызываете функцию C, а не совершенно другую функцию C.

Если вы хотите выполнить отправку сообщения Ruby, используя правила отправки сообщений Ruby, вы не можете вызвать функцию C, или, точнее, вам нужно вызвать функцию C, которая выполняет отправку сообщения Ruby и выполняет поиск и так далее, что ( сбивает с толку) не называется send в YARV, а скорее funcall. Есть несколько их вариаций, и все они называются вариациями rb_funcall.

person Jörg W Mittag    schedule 29.07.2017