Ruby: нет блока с учетом ошибки - PullRequest
8 голосов
/ 03 апреля 2011

При попытке передать строку в is_tut я получаю сообщение об ошибке «без блока»? метод. Я новичок в Ruby и понятия не имею, что я делаю не так. Любая помощь будет оценена.

class Tut
@@consonants = ["b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z"]

  def is_tut? string
    if string =~ /^(([b-df-hj-np-z]ut)|([aeiou\s])|[[:punct:]])+$/i
      yield
    else
      false
    end
  end

  def self.to_tut string 
        string.each_char do |c|
            c += "ut" if @@consonants.find { |i| i == c.downcase }
            yield c
        end
    end

    def self.to_english string
        array = string.split //
        array.each do |c|
            if @@consonants.find { |i| i == c.downcase }
                array.shift
                array.shift
            end
            yield c
        end
    end


end

#Tut.to_tut( "Wow! Look at this get converted to Tut!" ) { |c| print c }
# should output : Wutowut! Lutookut atut tuthutisut gutetut cutonutvuteruttutedut tuto Tututut!

puts
puts

tut = Tut.to_tut( "Wow! Look at this get converted to Tut!" )
puts "from return: #{tut}"

puts

#Tut.to_tut( "Wutowut! Lutookut atut tuthutisut gutetut cutonutvuteruttutedut tuto Tututut!" ) { |c| print c }
# should outout : Wutowut! Lutookut atut tuthutisut gutetut cutonutvuteruttutedut tuto Tututut!
puts
puts

#tut = Tut.to_tut( "Wutowut! Lutookut atut tuthutisut gutetut cutonutvuteruttutedut tuto Tututut!" )
#puts "from return: #{tut}"

puts

#tut_string = ""
#Tut.to_tut( "I'm in tut but I want to be in english." ) { |c| tut_string += c }
#puts tut_string
# should output : I'mut inut tututut bututut I wutanuttut tuto bute inut enutgutlutisuthut.

puts

#Tut.to_english( tut_string ) { |c| print c }
# should output : I'm in tut but I want to be in english.

Ответы [ 3 ]

18 голосов
/ 03 апреля 2011

Если у вас есть yield в определении вашего метода, это означает, что вы должны обязательно пропустить блок, когда вы его используете (если только часть, включающая его, не выполнена согласно условию и т. Д.).(Возможно, вы уже знаете, но в случае, если вы этого не сделаете: блок - это то, что описывается как {...} или do ... end). И yield будет ссылаться на блок.сделайте блок необязательным, тогда один из способов сделать это - поместить символ & перед именем переменной.

def method(argument, &block_argument)
   if block_argument # block is given
      block_argument.call(argument_for_block) # use call to execute the block
   else # the value of block_argument becomes nil if you didn't give a block
      # block was not given
   end
end

Это разрешит необязательный блок.Или, как предполагает Squeegy,

def method(argument)
   if block_given? # block is given
      yield(argument_for_block) # no need to use call to execute the block
   else 
      # block was not given
   end
end

также будет работать.

1 голос
/ 03 апреля 2011

Поскольку вы вызываете yield в своем методе to_tut(), эта строка не будет работать:

tut = Tut.to_tut( "Wow! Look at this get converted to Tut!" )

Вам либо нужно , чтобы дать блок (как вы это делали впервый закомментированный вызов Tut.to_tut()), или , вам нужно изменить функцию to_tut() на , чтобы сделать блок кода необязательным :

def self.to_tut string 
    string.each_char do |c|
        c += "ut" if @@consonants.find { |i| i == c.downcase }
        yield c if block_given?
    end
end
0 голосов
/ 03 апреля 2011

yield требует, чтобы блок был передан to_tut.

Когда вы делаете:

Tut.to_tut( "Wow! Look at this get converted to Tut!" ) { |c| print c }

Это работает, потому что у него есть блок { |c| print c }.

Без блока это вызовет ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...