Можно ли передать вызов функции в качестве аргумента функции в Solidity?

В общем, нормально ли вызывать fun () в качестве аргумента, например ethToWeiConverter в приведенном ниже примере? Иначе какой стиль предпочтительнее?

 contract RefundableCrowdsale   { uint256 cap ; 

   RefundableCrowdsale   ( uint256 _cap )   { cap =  _cap ; 
   } 
 } contract MyCrowdsale   is   RefundableCrowdsale   { 

   // constructor 
   function   MyCrowdsale   ( cap )   RefundableCrowdsale   ( ethToWeiConverter ( cap ) 
   )   { 
     ... 
   } 

   function  ethToWeiConverter ( uint256 eths )  returns ( uint256 )   { 
     return  eths *   10 ** 18 
   } 
 } 
Похоже, вы не передали функцию в качестве аргумента в приведенном выше примере, но вызвали другую функцию. Я думаю, что это нормально. Но ваш пример выше является неполным.
Спасибо @EduardoPereira за указание. Я отредактировал описание вопроса, чтобы оно было более правильным
синтаксис, который вы включаете в блок кода выше, не поддерживается Solidity, и я не уверен, что понимаю, что вы просите или пытаетесь сделать. В любом случае Solidity не является функциональным языком программирования - функции не являются объектами, и, насколько я знаю, их нельзя передавать в качестве аргументов функциям.

Ответы (1)

Да, можно передавать функции в качестве параметров. Из комментария к Этдев Кристис

 pragma solidity ^ 0.4 . 15 ; contract B { 

     function  plus ( uint  a ,   uint  b )   internal  returns ( uint )   { 
         return  a +  b ; 
     } 

     function  minus ( uint  a ,   uint  b )   internal  returns ( uint )   { 
         return  a -  b ; 
     } 

     function   eval ( function   ( uint ,   uint )   internal  returns ( uint )  f ,   uint  x ,   uint  y )   internal  returns ( uint )   { 
         return  f ( x ,  y ); 
     } 

     function  calc ( uint  op ,   uint  x ,   uint  y )  constant public  returns ( uint )   { 
         function   ( uint ,   uint )   internal  returns ( uint )  g ; 
         if   ( op ==   0 )   { g =  plus ; 
         }   else   if   ( op ==   1 )   { g =  minus ; 
         } 
         return   eval ( g ,  x ,  y ); 
     } 
 } 

Примечание: это не компилируется в ремикс, парсер запутывается.