tl; dr : Как сделать идеальную пересылку в D?
Ссылка имеет отличное объяснение, но, например, допустим, у меня есть этот метод:
void foo(T)(in int a, out int b, ref int c, scope int delegate(ref const(T)) d)
const nothrow
{
}
Как мне создать другой метод, bar ()
, который может быть вызван вместо foo ()
, который впоследствии вызывает foo ()
«идеально» (т. е. без создания проблем с компиляцией / областью видимости и т. д. на вызывающем сайте)?
Наивный подход
auto bar(T...)(T args)
{
writeln("foo() intercepted!");
return foo(args);
}
, конечно, не работает, потому что он не обрабатывает ref
, в
, out
], inout
, const
-ность метода, чистая
-ity, nothrow
и т. Д., А также ограничивает как значения могут использоваться с r-значениями.
И я не знаю, как обрабатывать эти возможные случаи ... есть идеи?
-121 --- 16848 52-
Я пытаюсь сложить два списка, чтобы первый элемент одного списка добавлялся к первому элементу другого списка, со второго ко второму и т. Д. сформировать новый список.
В настоящее время у меня есть:
def zipper(a,b):
list = [a[i] + b[i] for i in range(len(a))]
print 'The combined list of a and b is'
print list
a = input("\n\nInsert a list:")
b = input("\n\nInsert another list of equal length:")
zipper(a,b)
При вводе двух списков, один из которых является списком целых чисел, а другой - списком строк, я получаю ошибку типа «Невозможно объединить объекты str и int».
Я попытался преобразовать оба списка в строки, используя:
list = [str(a[i]) + str(b[i]) for i in range(len(a))]
, однако после ввода:
a = ['a','b','c','d']
b = [1,2,3,4]
я получил вывод как:
['a1', 'b2', 'c3', 'd4']
вместо того, что я хотел:
['a+1','b+2','c+3','d+4']
Есть ли у кого-нибудь предложения относительно того, что я делаю неправильно?
NB Мне нужно написать функцию, которая по сути будет выполнять то же самое, что и zip (a, b), но мне не разрешено использовать zip () где-либо в функции.