Mam ciąg znaków, który został utworzony w czasie wykonywania. Chcę użyć tego ciągu jako zmiennej do przechowywania niektórych danych do niego. Jak mogę przekonwertować ciąg na nazwę zmiennej?Używanie łańcucha jako zmiennej w czasie wykonywania
Odpowiedz
Można użyć eval()
na to pod warunkiem, że już ogłosił swoją zmienną pierwszy:
>> foo = []
>> eval("foo")[1] = "bar"
>> foo[1]
=> "bar"
Oto docs.
Nie chcę być negatywny, ale ostrożnie kroczę. Ruby oferuje wiele funkcji do bardzo dynamicznego programowania, takich jak define_method
, przechowywanie bloków jako obiektów Proc
, które będą nazywane później, itp. Zasadniczo są to czystsze kody i znacznie bezpieczniejsze. 99% czasu przy użyciu eval()
jest błędem.
I absolutnie nigdy nie używaj eval()
w ciągu zawierającym dane wprowadzone przez użytkownika.
Jeśli można wybaczyć znak @ przed nazwą zmiennej, co następuje zadziała:
variable_name = ... # determine user-given variable name
instance_variable_set("@#{variable_name}", :something)
To utworzy zmienną o nazwie @whatever
, a jego wartość ustawiona :something
. :something
, oczywiście, może być cokolwiek chcesz. Wygląda na to, że działa w zasięgu globalnym, deklarując spontaniczną instancję Object
, która wiąże wszystko (nie mogę znaleźć odniesienia do tego).
Metoda instance_variable_get
umożliwia pobranie wartości według nazwy w ten sam sposób.
instance_variable_get("@#{variable_name}")
Jak mówi Jason Watkins, wiele osób może szybko użyć eval(), co byłoby poważnym błędem. W większości przypadków możesz użyć techniki opisanej przez Tacka, jeśli zadbałeś o użycie zmiennej instancji klasy zamiast lokalnej.
Zmienne lokalne zazwyczaj nie są dostępne. Wszystko z prefiksem @ lub @@ jest łatwo odzyskiwane.
Zamiast tego zrobić bezpośrednio, dlaczego nie rozważyć użycia skrótu zamiast tego. Łańcuch będzie kluczem, a wartość, którą chcesz zapisać, będzie wartością. Coś takiego:
string_values = { }
some_string = params[:some_string] # parameter was, say "Hello"
string_values[some_string] = 42
string_values # { 'Hello' => 42 }
some_number = string_values[some_string]
some_number # 42
Ma to kilka zalet. Po pierwsze, oznacza to, że nie robisz nic magicznego, co może być trudne do zrozumienia później. Po drugie, używasz bardzo typowego języka Rubiego, który jest używany do podobnych funkcji w Railsach.
dokładnie myślę :) –
Huh? Co jeśli chcesz po prostu zapisać "Hello" jako zmienną, która będzie później używana. Gdzie są 42? Wydaje się to zbyt skomplikowane ...chociaż wprawdzie jestem nowicjuszem Rubinowym. – Southerneer
To nie jest pytanie zadawane przez pytającego. Odbierają one ciąg znaków z * runtime * i chcą skojarzyć ten ciąg z wartością. Oczywiście, możesz zhackować system, aby utworzyć zmienną o tej nazwie napisu (z powiązanym z nią zastrzeżeniem błędu sprawdzającym ciąg znaków, aby upewnić się, że jest to poprawny identyfikator), ale sugeruję, że używasz prostego, szeroko rozumianego i bezpiecznego Rubiego. Hash', aby powiązać ciąg i wartość razem. –
Teraz po prostu za pomocą metody instance_variable_set można utworzyć zmienną instancji w środowisku wykonawczym.
instance_variable_set('@' + 'users', User.all)
- 1. Chcę uzyskać typ zmiennej w czasie wykonywania
- 2. eval() nie przypisuje zmiennej w czasie wykonywania
- 3. Jak sprawdzić typ zmiennej w C w czasie wykonywania?
- 4. Fortran - ustawienie rodzaju/precyzji zmiennej w czasie wykonywania
- 5. Używanie zmiennej jako wzorca sprawy w Bash
- 6. Używanie pamięci C# app w czasie wykonywania ankiety?
- 7. Kompilowanie i używanie klas Groovy z Java w czasie wykonywania?
- 8. Czy można oglądać zmienne w czasie wykonywania?
- 9. Ładowanie XAML w czasie wykonywania?
- 10. Awaria OCMock w czasie wykonywania
- 11. metoda wywołania w czasie wykonywania
- 12. Powielanie składników w czasie wykonywania
- 13. Zmienić ustawienia narodowe w czasie wykonywania?
- 14. Rejestrowanie metoda czasie wykonywania
- 15. Używanie ciągu znaków jako nazwy zmiennej
- 16. Używanie NiceMock jako zmiennej instancji z GoogleMock
- 17. Jak pozbyć się LD_LIBRARY_PATH w czasie wykonywania?
- 18. Zmiana implementacji/klasy w czasie wykonywania
- 19. knockout.js ładowanie szablonów w czasie wykonywania
- 20. Jak zmienić rozszerzenie pliku w czasie wykonywania
- 21. Przekształć typelistę z funkcją w czasie wykonywania
- 22. Używanie łańcucha sepBy w Attoparsec
- 23. Załadować dll COM w czasie wykonywania?
- 24. C++ Przypisywanie wartości stałej w czasie wykonywania?
- 25. uzyskać informacje o adnotacji w czasie wykonywania
- 26. Uzyskiwanie typu szablonu w czasie wykonywania
- 27. Renderowanie obrazu w czasie wykonywania w WPF
- 28. Użyj zmiennej jako Czas w setInterval/setTimeout
- 29. Narzędzia Java do łączenia wykonywania w czasie wykonywania z pokryciem
- 30. Używanie zmiennej klasy jako niestandardowego argumentu w pytonie
Dlaczego '@ # {nazwa_zmiennej} =: coś nie działa? –
Otrzymuję 'nie jest dozwolone jako nazwa zmiennej instancji' dla 'instance_variable_set'. Railsy 3.0.7. –
To jest genialne! –