Ruby - Передающие блоки к методам

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
41
задан niton 15 April 2015 в 21:36
поделиться

5 ответов

Код David будет хорошо работать, но это - более легкое и более короткое решение:

foo = Proc.new { |prompt| prompt.echo = false }
new_pass = ask("Enter your new password: ", &foo)
verify_pass = ask("Enter again to verify: ", &foo)

можно также использовать амперсанд для присвоения блока переменной при определении метода:

def ask(msg, &block)
  puts block.inspect
end
72
ответ дан BrendanDean 27 November 2019 в 00:28
поделиться

Это - то, как необходимо сделать это, чистый и простой:

def ask(question)
    yield(question)
end

proc = Proc.new { |question| puts question }
new_pass = ask("Enter your new password: ", &proc)
verify_pass = ask("Enter again to verify: ", &proc)
13
ответ дан Honza 27 November 2019 в 00:28
поделиться
foo = Proc.new { |prompt| prompt.echo = false }
new_pass = ask("Enter your new password: ") {|x| foo.call(x)}
verify_pass = ask("Enter again to verify: ") {|x| foo.call(x)}
4
ответ дан nickgrim 27 November 2019 в 00:28
поделиться

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

def foo(prompt)
  prompt.echo = false
end
new_pass = ask("Enter your new password: ") { |prompt| foo(prompt) }
verify_pass = ask("Enter again to verify: ") { |prompt| foo(prompt) }

Это действительно не сокращает код, хотя это действительно удаляет некоторое дублирование - если бы Вы хотели сделать больше, чем набор prompt.echo к false, необходимо было бы только добавить код в одном месте.

-3
ответ дан Lucas Oman 27 November 2019 в 00:28
поделиться

Вот пример, который будет префиксировать индекс методом yield и добавлять индекс методом call.

class Array
  def alter_each!
    self.each_with_index do |n, i|
      self[i] = yield(n,i)
    end
  end
  def modify_each!(add_one = true, &block)
    self.each_with_index do |n, i|
      j = (add_one) ? (i + 1) : i
      self[i] = block.call(n,j)
    end
  end
end

a = ["dog", "cat", "cow"]

a.alter_each! do |n, i|
  "#{i}_#{n}"
end

a.modify_each! false do |n,i|
  "#{n}_#{i}"
end

puts a
2
ответ дан 27 November 2019 в 00:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: