LINUX.ORG.RU

История изменений

Исправление alysnix, (текущая версия) :

Вам уже 10 раз объяснили, что у трейтов нет vtable.

а что у них есть? как осуществется вызов трейтового метода по ссылке на трейт, что реализован в классе А и в классе B? пусть даже реализован совершенно одинаково, копипейстом.

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

потому что ссылка на интерфейс не знает от какого конкретного класса она взята, и как именно интерфейс реализован данным конкретным классом.

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

да чо там! читаем https://doc.rust-lang.org/1.29.2/book/first-edition/trait-objects.html#representation, там все написано:

The methods of the trait can be called on a trait object via a special record of function pointers traditionally called a ‘vtable’ (created and managed by the compiler).

A vtable is essentially a struct of function pointers, pointing to the concrete piece of machine code for each method in the implementation. A method call like trait_object.method() will retrieve the correct pointer out of the vtable and then do a dynamic call of it.

Исправление alysnix, :

Вам уже 10 раз объяснили, что у трейтов нет vtable.

а что у них есть? как осуществется вызов трейтового метода по ссылке на трейт, что реализован в классе А и в классе B? пусть даже реализован совершенно одинаково, копипейстом.

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

потому что ссылка на интерфейс не знает от какого конкретного класса она взята, и как именно интерфейс реализован данным конкретным классом.

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

да чо там! читаем https://doc.rust-lang.org/1.29.2/book/first-edition/trait-objects.html#representation, там все написано:

The methods of the trait can be called on a trait object via a special record of function pointers traditionally called a ‘vtable’ (created and managed by the compiler).

Исходная версия alysnix, :

Вам уже 10 раз объяснили, что у трейтов нет vtable.

а что у них есть? как осуществется вызов трейтового метода по ссылке на трейт, что реализован в классе А и в классе B? пусть даже реализован совершенно одинаково, копипейстом.

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

потому что ссылка на интерфейс не знает от какого конкретного класса она взята, и как именно интерфейс реализован данным конкретным классом.

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