В чем разница между включением и расширением в Ruby?

Вот функция, которая помогает вам проверить, находится ли мышь внутри элемента или нет. Единственное, что вам нужно сделать, - это вызвать функцию, в которой вы можете связать объект EventObject, связанный с ядром. что-то вроде этого:

$("body").mousemove(function(event){
     element_mouse_is_inside($("#mycontainer", event, true, {});
});

Вы можете увидеть исходный код здесь в github или в нижней части сообщения:

https://github.com/mostafatalebi /ElementsLocator/blob/master/elements_locator.jquery.js

function element_mouse_is_inside  (elementToBeChecked, mouseEvent, with_margin, offset_object)
{
    if(!with_margin)
    {
        with_margin = false;
    }
    if(typeof offset_object !== 'object')
    {
        offset_object = {};
    }
    var elm_offset = elementToBeChecked.offset();
    var element_width = elementToBeChecked.width();
    element_width += parseInt(elementToBeChecked.css("padding-left").replace("px", ""));
    element_width += parseInt(elementToBeChecked.css("padding-right").replace("px", ""));
    var element_height = elementToBeChecked.height();
    element_height += parseInt(elementToBeChecked.css("padding-top").replace("px", ""));
    element_height += parseInt(elementToBeChecked.css("padding-bottom").replace("px", ""));
    if( with_margin)
    {
        element_width += parseInt(elementToBeChecked.css("margin-left").replace("px", ""));
        element_width += parseInt(elementToBeChecked.css("margin-right").replace("px", ""));
        element_height += parseInt(elementToBeChecked.css("margin-top").replace("px", ""));
        element_height += parseInt(elementToBeChecked.css("margin-bottom").replace("px", ""));
    }

    elm_offset.rightBorder = elm_offset.left+element_width;
    elm_offset.bottomBorder = elm_offset.top+element_height;

    if(offset_object.hasOwnProperty("top"))
    {
        elm_offset.top += parseInt(offset_object.top);
    }
    if(offset_object.hasOwnProperty("left"))
    {
        elm_offset.left += parseInt(offset_object.left);
    }
    if(offset_object.hasOwnProperty("bottom"))
    {
        elm_offset.bottomBorder += parseInt(offset_object.bottom);
    }
    if(offset_object.hasOwnProperty("right"))
    {
        elm_offset.rightBorder += parseInt(offset_object.right);
    }
    var mouseX = mouseEvent.pageX;
    var mouseY = mouseEvent.pageY;

    if(  (mouseX > elm_offset.left && mouseX < elm_offset.rightBorder)
        && (mouseY > elm_offset.top && mouseY < elm_offset.bottomBorder) )
    {
        return true;
    }
    else
    {
        return false;
    }
}

390
задан nbro 20 August 2017 в 23:51
поделиться

3 ответа

То, что Вы сказали, корректно. Однако существует больше к нему, чем это.

, Если у Вас есть класс Klazz и модуль Mod, включая Mod в Klazz, приводит примеры Klazz доступ к Mod методы. Или можно расшириться Klazz с Mod предоставление доступ класса Klazz к Mod методы. Но также и можно расширить произвольный объект с помощью [1 110]. В этом случае отдельный объект добирается Mod методы даже при том, что все другие объекты с тем же классом как [1 112] не делают.

233
ответ дан Anwar 20 August 2017 в 23:51
поделиться

Это корректно.

Негласно, включайте, на самом деле псевдоним для append_features, который (из документов):

реализация по умолчанию Ruby должна добавить константы, методы и переменные модуля этого модуля к aModule, если этот модуль не был уже добавлен к aModule или одному из его предков.

14
ответ дан Toby Hede 20 August 2017 в 23:51
поделиться

Когда Вы include модуль в класс, методы модуля импортируются как [1 125] методы экземпляра .

Однако, когда Вы extend модуль в класс, методы модуля импортируются как [1 127] методы класса .

, Например, если у нас есть модуль Module_test определенный следующим образом:

module Module_test
  def func
    puts "M - in module"
  end
end

Теперь, для [1 128] include модуль. Если мы определяем класс A следующим образом:

class A
  include Module_test
end

a = A.new
a.func

вывод будет: M - in module.

, Если мы заменяем строку include Module_test extend Module_test и выполняем код снова, мы получаем следующую ошибку: undefined method 'func' for #<A:instance_num> (NoMethodError).

Изменение вызова метода a.func к [1 112], вывод изменяется на: M - in module.

От вышеупомянутого выполнения кода, ясно что, когда мы include модуль, его методы становятся методы экземпляра и когда мы extend модуль, его методы становятся методы класса .

2
ответ дан 22 November 2019 в 23:42
поделиться
Другие вопросы по тегам:

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