Pluje się, że rand nie powinien mieć argumentów

Witam,

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?

Mein goth, która wersja Ruby?
A gdyby konstrukcję z “=” zastąpić samym a i owo a wcześniej i osobno inicjalizować z self.size?

wersja 1.8.7

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

A u mnie ten kod działa (takoż ruby 1.8.7), tyle że niezależnie od tablicy i argumentu zwraca nil.

Tomash, w Rubym trzeba myśleć o krok do przodu :stuck_out_tongue: (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 :wink:
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?”)

Tak, tak, tak raderek, wielkie dzięki za pomoc, o to właśnie chodziło. Teraz lata jak trzeba

Tobie Tomash też dzięki za próby i chęci pomocy