ОБНОВЛЕНИЕ. Поскольку этот ответ, похоже, получил некоторый интерес в последнее время, я хотел бы указать, что обсуждение g0 на трекер-проблеме Ruby устраняет обсуждаемую здесь функцию, а именно, запретить определение методов внутри тела метода .
Нет, Ruby не имеет вложенных методов.
Вы можете сделать что-то вроде этого:
class Test1
def meth1
def meth2
puts "Yay"
end
meth2
end
end
Test1.new.meth1
Но то есть не вложенный метод. Повторяю: Ruby не имеет вложенных методов .
Что это такое, это определение динамического метода. Когда вы запустите meth1
, тело meth1
будет выполнено. Тело просто определяет метод с именем meth2
, поэтому после запуска meth1
один раз вы можете вызвать meth2
.
Но где определено meth2
? Ну, очевидно, не определяется как вложенный метод, так как не являются вложенными методами в Ruby. Он определен как метод экземпляра Test1
:
Test1.new.meth2
# Yay
Кроме того, он будет, очевидно, переопределяться каждый раз при запуске meth1
:
Test1.new.meth1
# Yay
Test1.new.meth1.
# test1.rb:3: warning: method redefined; discarding old meth2
# test1.rb:3: warning: previous definition of meth2 was here
# Yay
Короче: no , Ruby не поддерживает вложенные методы.
Обратите также внимание на то, что в Ruby тела методов не могут быть закрытыми, только блокирующие тела могут. Это в значительной степени устраняет основной вариант использования вложенных методов, поскольку даже , если Ruby поддерживает вложенные методы, вы не могли использовать переменные внешнего метода во вложенном методе.
ОБНОВЛЕНИЕ ПРОДОЛЖЕНИЕ: на этапе later , этот синтаксис может быть повторно использован для добавления вложенных методов в Ruby, которые будут вести себя так, как я описал: они будут привязаны к их содержащему методу, т.е. невидимыми и недоступными вне тела их тела. И, возможно, у них будет доступ к лексическому охвату их содержательного метода. Однако, если вы прочитаете обсуждение, которое я связал выше, вы можете заметить, что matz сильно зависит от вложенных методов (но все же для удаления вложенных определений методов).
fromPromise
устарело, его больше нет в документации . Используйте from
, чтобы получить наблюдаемое из обещания .
import { from } from 'rxjs';
let obs1 = from(this.diagnostic.isLocationAuthorized());
let obs2 = fromPromise(this.diagnostic.isLocationEnabled());
let obs3 = fromPromise(this.geolocation.getCurrentPosition());
Но подумайте, стоит ли это того, чтобы использовать его. Этот ответ поможет вам решить .
Оказывается, вы можете смешивать асинхронное ожидание с наблюдаемыми, но это не значит, что оно подойдет для вашего варианта использования. ( используйте этот код с осторожностью )
import { defer } from 'rxjs';
defer(async function() {
const a = await promiseDelay(1000).then(() => 1);
const b = a + await promiseDelay(1000).then(() => 2);
return a + b + await promiseDelay(1000).then(() => 3);
})
.subscribe(x => console.log(x)) // logs 7
Но не забудьте, что Async-await и Observables не работают вместе . Отложите документы .