Avatar billede hurra Novice
02. oktober 2007 - 15:15 Der er 6 kommentarer og
1 løsning

function pointer i ruby

Kan man lave en pointer til en rigtigt funktion, ikke bare en metode, i ruby?

Til metoden kan jeg gøre følgende:
class Class
  def func(input)
    puts input
  end
end
   
m=Class.new
fp=m.method(:func)
fp.call("hej")

Og det virker, men til en funktion ville jeg jo så gætte på det burde se nogen lunde sådan her ud:
def func(input)
  puts input
end
   
fp=:func
fp("Hej")

Men det virker bare ikke :(

Er der nogen der har en plan?
Avatar billede arne_v Ekspert
02. oktober 2007 - 16:50 #1
Prøv:

def func(input)
  puts input
end
 
fp=Proc.new{|s|func(s)}
fp.call("Hej")
Avatar billede hurra Novice
03. oktober 2007 - 10:38 #2
Du har ret igen Arne. Mange tak for hjælpen. Kom med et svar.
Avatar billede hurra Novice
03. oktober 2007 - 10:58 #3
Forresten lige et tillægs spørgsmål. Det jeg skal bruge det til er, at jeg har en del funktioner der skal kaldes efter hinanden, og alle funktionerne minder om hinanden (de kører nogle tests for forskellige ting). Efter funktionerne er blevet udført skal jeg checke på hvad de returnere, og de 'actions' der skal tages ud fra retur værdierne er nødagtigt de samme for alle funktionerne.

Derfor ville jeg lave en ny funktion, som så tager alle mini oprindelige funktioner som input, og følger op på hvad der skal ske bag efter.

Kan jeg lave noget smart så jeg ikke skal kalde den nye funktion med 'Proc.new{|s|func(s)}' som input, men evt bare funktions navnet, eller måske bare en macro der definere 'Proc.new{|s|NAME(s)}' ?

def func(input)
  puts input
end
   
def func2(f)
  f.call("Hej")
end
   
func2(Proc.new{|s|func(s)})
Avatar billede hurra Novice
03. oktober 2007 - 12:21 #4
Jeg kunne jo forresten selvføldig også lave et array af de funktioner jeg vil ha kørt:

func2(
  Proc.new {
    |s|
    [
      func_a(s),
      func_b(s),
      func_c(s)
  } )
Avatar billede arne_v Ekspert
03. oktober 2007 - 22:46 #5
Jeg er ikke god til Ruby men følgende kører:

def f1(n)
  return n*2
end

def f2(n)
  return n+2
end

def test(fx)
  fx.each { |f| puts f.call(3) }
end
 
flst = [ Proc.new { |n| f1(n) }, Proc.new{ |n| f2(n) } ]
test(flst)

hvor test kunne lave mere end bare puts.
Avatar billede arne_v Ekspert
03. oktober 2007 - 22:46 #6
og et svar
Avatar billede hurra Novice
04. oktober 2007 - 10:10 #7
Ok, jeg holder mid til der andet forslag jeg sendte med Proc blokken, da proc kun undgår én gang. Men stadig mange tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger AI forretningskonsulent i Ballerup

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger elementleder til System sektionen i Hvidovre

AL Sydbank A/S (tidligere Arbejdernes Landsbank)

Tech Lead til Datacenter Operations