Ruby - распечатайте имя переменной и затем его значение

Что лучший способ состоит в том, чтобы записать функции (или что-то DSLish), который позволит мне писать этот код в Ruby. Как я создал бы функцию write_pair?

username = "tyndall"
write_pair username
# where write_pair username outputs 
username: tyndall

Можно ли это сделать? Поиск самого простого способа сделать это.

25
задан memius 3 October 2017 в 13:50
поделиться

4 ответа

Конечно, это возможно!

Мое решение проверяет переменную по идентификатору Object # object_id: http://codepad.org/V7TXRxmL
Он искажен в стиле передачи привязки .. .
Хотя он пока работает только для локальных переменных, его можно легко сделать «универсальным», добавив использование других методов перечисления переменных области видимости, таких как instance_variables и т. Д.

# the function must be defined in such a place 
# ... so as to "catch" the binding of the vars ... cheesy
# otherwise we're kinda stuck with the extra param on the caller
@_binding = binding
def write_pair(p, b = @_binding)
  eval("
    local_variables.each do |v| 
      if eval(v.to_s + \".object_id\") == " + p.object_id.to_s + "
        puts v.to_s + ': ' + \"" + p.to_s + "\"
      end
    end
  " , b)
end

# if the binding is an issue just do here:
# write_pair = lambda { |p| write_pair(p, binding) }

# just some test vars to make sure it works
username1 = "tyndall"
username  = "tyndall"
username3 = "tyndall"

# the result:
write_pair(username)
# username: tyndall
21
ответ дан 28 November 2019 в 20:43
поделиться

Если вы можете использовать символ вместо имени переменной, вы можете сделать что-то вроде этого:

def wp (s, &b)
  puts "#{s} = #{eval(s.to_s, b.binding)}"
end

Используется:

irb(main):001:0> def wp (s, &b)
irb(main):002:1>   puts "#{s} = #{eval(s.to_s, b.binding)}"
irb(main):003:1> end
=> nil
irb(main):004:0> var = 3
=> 3
irb(main):005:0> wp(:var) {}
var = 3

Примечание что вы должны передать методу пустой блок {} , иначе он не сможет получить привязку для оценки символа.

15
ответ дан 28 November 2019 в 20:43
поделиться

На самом деле вы не можете получить имя переменной в Ruby. Но вы можете сделать что-то вроде этого:

data = {"username" => "tyndall"}

Или даже,

username = "tyndall"
data = {"username", "password", "favorite_color"}
data.each { |param|
   value = eval(param)
   puts "#{param}: #{value}"
}
3
ответ дан 28 November 2019 в 20:43
поделиться

Я создал макрос vim для этого:

" Inspect the variable on the current line (in Ruby)
autocmd FileType ruby nmap ,i ^"oy$Iputs "<esc>A: #{(<esc>"opA).inspect}"<esc>

Поместите переменную, которую вы хотите проверить, в отдельную строку, затем введите , i (запятая, затем i) в обычном режиме. Он превращает это:

foo

в следующее:

puts "foo: #{(foo).inspect}"

Это хорошо, потому что у него нет никаких внешних зависимостей (например, вам не нужно загружать библиотеку, чтобы использовать ее).

5
ответ дан 28 November 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: