Mam jakiś głupi problem. Potrzebowałem metody, która zwróci mi losowy kawałek tablicy. Ile elementów chciałeś, określałeś w argumencie. Jak chciałeś więc niż ma tablica, to zwraca cała tablicą. W 1.9 jest sample, więc ja postanowiłem sobie dopisać:
[code]class Array
def sample(n)
# get n random elements from array and return as other array
result = []
if n < self.size
loop do
result << self[rand(a = self.size)]
self.delete_at(a)
break if self.size < 1 or result.size >= n
end
else
result = self
end
end
end[/code]
w environment.rb daje require “array.rb” i je okej, z tymże w lini:
result << self[rand(a = self.size)]
zwraca mi bład
wrong number of arguments (1 for 0)
Przecież do rand można dawać argumenty - sprawdzałem to zarówno w dokumentacji jak i w irb. O ciul chodzi?
Zastąpienie konstrukcji z “=” na to co piszesz była chyba pierwszą rzeczą, którą próbowałem zrobić. Logicznie nie powinno nic pomóc, ale spróbowałem. Zgodnie z logiką nie pomogło
Tomash, w Rubym trzeba myśleć o krok do przodu (zwłaszcza, w sytuacji kiedy “u mnie działa, a u niego nie”). Tak na szybko to zgaduję, że kolega ten kod testuje w aplikacji railsowej. Jeśli mnie pamięć nie myli to activesupport (ładowany przez railsy) definiuje metodę Array#rand (bezargumentowa), która to zwraca losowy element tablicy. Zatem wywołanie self[rand(a = self.size)] oznacza self[self.rand(a = self.size)] i już widać w czym problem. Ciebie interesuje “globalna” metoda rand z rubiego, a ta railsowa Ci ją przysłoniła. Jeśli nadal potrzebujesz własnej definicji metody “sample” to spróbuj wywołania:
Kernel.rand(a = self.size)
Wtedy jawnie odwołujesz się do tej metody rand o którą Ci chodzi.
Kolega tego nie napisał, a nie chciałem go od razu rugać za niedostateczne opisanie problemu
Podejrzewałem że robi w Railsach, bo i sam Array#rand używałem parę razy, ale późno było i zadziałała ostrożność (“a nuż mi się coś pomerdało i to było z facetsów, a nie railsów?”)