Ruby: Kein "Block" - Fehler
Dass ich immer ein "Nein block gegeben' Fehler beim übergeben Sie die Zeichenfolge, um die is_tut? Methode. Ich bin neu in Ruby und habe keine Ahnung was ich falsch mache. Jegliche Hilfe würde geschätzt werden.
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.
- Nur als Tipp, mehr Ruby-ish Weg zu definieren, Ihre Konsonanten wäre:
@@consonants = ('a' .. 'z').to_a - %w[a e i o u]
- Ah, danke für den Tipp!
- In Ruby, Einzug ist in der Regel zwei Räume.
- Es blickt direkt in Textmate, finde es einfach nicht richtig einfügen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie
yield
innerhalb Ihrer Methode-definition, das heißt, Sie müssen zwingend übergeben Sie einen block, wenn Sie es verwenden (es sei denn, der Teil darunter ist es nicht ausgeführt, gemäß Klimaanlage etc.). (Die Sie vielleicht schon wissen, aber im Fall Sie nicht: ein block ist etwas, das beschrieben wird als{...}
oderdo ... end
) Undyield
beziehen sich auf den block.Wenn Sie wollen, um einen block optional, dann einen Weg, es zu tun ist, um die
&
symbol vor den Namen der Variablen.Dies wird es ermöglichen, optional zu blockieren. Oder, wie vorgeschlagen von Squeegy,
wird auch funktionieren.
block_given?
etwas wieyield if block_given?
block_given
überprüft, ob es einen block, und wenn nicht, gibt Sie false zurück, und dieyield
wird nicht ausgeführt, das heißt, es wird nicht verursachen einen Fehler.Weil Sie hier aufrufen
yield
in Ihremto_tut()
Methode, diese Linie Versagen werden:Du entweder müssen zu geben, einen block (wie in der ersten, auskommentierten Aufruf
Tut.to_tut()
), oder müssen Sie zum ändern derto_tut()
Funktion der code-block optional:yield
erfordert einen block übergeben werdento_tut
.Wenn du dies tust:
Es funktioniert, weil es die block
{ |c| print c }
.Ohne es zu blockieren löst den Fehler.