JaredPar,
Это не сработало для меня, если я передаю typeof (type & lt;>) как toCheck. Вот что я изменил.
static bool IsSubclassOfRawGeneric(Type generic, Type toCheck) {
while (toCheck != typeof(object)) {
var cur = toCheck.IsGenericType ? toCheck.GetGenericTypeDefinition() : toCheck;
if (cur.IsGenericType && generic.GetGenericTypeDefinition() == cur.GetGenericTypeDefinition()) {
return true;
}
toCheck = toCheck.BaseType;
}
return false;
}
Я собираюсь попытаться суммировать различные ответы сам, так как у каждого было что-то ценное для высказывания, но ни один действительно не добрался до того, что я теперь понимаю, вероятно, лучший ответ:
я задавал неправильный вопрос, потому что я делал его неправильно.
По причинам я больше не могу объяснять, я хотел ряд абсолютно автономных функций в библиотеке, которая представила методы, которые я пробовал к DRY из моих классов. Это может быть достигнуто, с помощью вещей как
module Foo
def self.method_one
end
def Foo.method_two
end
class << self
def method_three
end
end
def method_four
end
module_function :method_four
end
я мог также include
мой модуль, или в классе, в этом случае методы становятся частью класса или снаружи, в этом случае они определяются на любом классе, который я выполняю внутри (Объект? Ядро? Irb, если я являюсь интерактивным? Вероятно, не прекрасная идея, тогда)
вещь, не было никакого серьезного основания не иметь класс во-первых - я так или иначе добрался до хода мыслей, который взял меня вниз редко используемое и откровенно немного странное ответвление. Вероятно, ретроспективный кадр ко дням перед OO стал господствующей тенденцией (я являюсь достаточно взрослым, что до сегодня я провел намного больше лет, пишущий процессуальный код).
, Таким образом, функции переместились в класс, где они кажутся довольно счастливыми, и методы класса, таким образом представленные, бодро используются везде, где необходимо.
Если Вы хотите Module
- функции уровня, определяете их каким-либо из этих способов:
module Foo
def self.method_one
end
def Foo.method_two
end
class << self
def method_three
end
end
end
Все эти пути сделают методы доступными как Foo.method_one
или Foo::method_one
и т.д.
, Как другие люди упомянули, методы экземпляра в Module
, с являются методами, которые доступны в местах, где Вы имеете include
d Module
Необходимо включать модуль
include Testfunctions
Тогда, 'abc' возвратит что-то.
Вы не можете назвать метод в Модуле непосредственно. Необходимо включать его в класс. Попробуйте это:
>> class MyTest
>> include TestFunctions
>> end
=> MyTest
>> MyTest.new.abc
123
=> nil
Можно также использовать module_function как так:
module TestFunctions
def abc
puts 123
end
module_function :abc
end
TestFunctions.abc # => 123
Теперь можно включать TestFunctions в класс и назвать "abc" из модуля TestFunctions.