Означает ли тот факт, что это не компилируется, означает, что они не совсем первого класса?
fun foo(s: String): Int = s.length // This won't compile. val bar = foo
Есть ли способ сделать это, не прибегая к ОО?
Нет, это не так.
В Kotlin для ссылки на функцию или свойство в качестве значения необходимо использовать вызываемые ссылки , но это всего лишь синтаксическая форма для получения значения типа функции :
fun foo(s: String): Int = s.length val bar = ::foo // `bar` now contains a value of a function type `(String) -> Int`
Как только вы получите это значение, вы не будете ограничены в том, как вы работаете с ним, о чем говорят первоклассные функции.
Вы можете использовать ссылку на функцию :::
::
fun foo(s: String): Int = s.length val bar = ::foo
И затем вызывать ее:
bar("some string")