История изменений
Исправление 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? пусть даже реализован совершенно одинаково, копипейстом.
трейт это интерфейс. а все интерфейсы предполают актуализацию методов тем классом, что его пытается реализовать. и другого способа вызвать актуальный метод по ссылке на интерфейс нет.
потому что ссылка на интерфейс не знает от какого конкретного класса она взята, и как именно интерфейс реализован данным конкретным классом.
статически вызвать функцию от интерфейса можно только если компилятор статически понимает, что ссылка указывает на экземпляр конкретного класса и иных вариантов быть не может. тогда можно вызывать напрямую конкретную функцию и не париться.